ORACLE数据库技术实用详解
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.2 动态性能视图

Oracle数据库中除了有这种采用具体表存放的数据字典信息以外,还有一种数据字典,叫做动态性能视图。

所谓动态性能视图,就是指将内存里的数据或控制文件里的数据以表的形式展现出来。它们实际都是虚拟表,并不是真正的表。只不过为了能够让我们更好地管理数据库的性能,所以将内存里的活动情况以表的形式展现出来。

只要数据库在运行,就会不断更新动态性能视图。一旦数据库关闭或崩溃,则动态性能视图里的数据就丢失了。下次重新启动数据库时,里面的数据重新开始计算。这不像前面讲到的数据字典表,数据字典表里的数据都是物理保存在数据文件里的,重启数据库并不会引起数据字典表里数据的丢失。

就像所有的数据字典视图名称都存放在dictionary视图里一样,所有的动态性能视图的名称都存放在v$fixed_table里。而这些动态性能视图都是以v_$开头,属主是用户sys。与数据字典表相同的是,Oracle为每个动态性能视图都创建了同名词,同名词则是将中间的“_”去掉了,都是以v$开头。比如v$session视图是我们经常要用到的视图,它记录了数据库中所有session的信息。

    SQL> select owner,synonym_name,table_owner,table_name
      2  from dba_synonyms where synonym_name='V$SESSION';
    OWNER       SYNONYM_NAME    TABLE_OWNER      TABLE_NAME
    --------- ------------- ------------  ---------------
    PUBLIC       V$SESSION         SYS           V_$SESSION

可以看到v$session是一个同名词,指向v_$session。我们继续追踪,查找v_$session的定义信息。

    SQL> select text from dba_views where view_name='V_$SESSION';
    TEXT
    --------------------------------------------------------------------------------
    select "SADDR","SID","SERIAL#","AUDSID","PADDR","USER#","USERNAME","COMMAND","……
    TS","SQL_TRACE_BINDS" from v$session

我们看到,v_$session是一个视图,它是基于v$session创建的。这里的v$session是一个真正的视图,而不是同名词。继续追踪之前,我们需要介绍另一个视图:v$fixed_view_definition,该视图里记录了所有动态性能视图的定义信息。

    SQL> select view_definition from v$fixed_view_definition where view_name='V$SESSION';
    VIEW_DEFINITION
    --------------------------------------------------------------------------------
    select  SADDR , SID , SERIAL# , AUDSID , PADDR , USER# , USERNAME , COMMAND ,
    ……
    from GV$SESSION where inst_id = USERENV('Instance')

可以看出,v$session是基于gv$session视图创建的。gv$session视图主要用于RAC环境(多个实例管理同一个数据库)。

    SQL> select view_definition from v$fixed_view_definition where view_name='GV$SESSION';
    VIEW_DEFINITION
    --------------------------------------------------------------------------------
    select s.inst_id,s.addr,s.indx,s.ksuseser,s.ksuudses,s.ksusepro,s.ksuudlui,
    …..
    from x$ksuse s, x$ksled e where bitand(s.ksspaflg,1)!=0 and bitand(s.ksuseflg,1)!=0 and
    s.ksuseopc=e.indx

这里,我们查看到了gv$session视图最终的定义信息。我们可以看到很多以x$开头的表。这些表不再是视图了,而是动态性能视图的基表。但是这些x$表都是内存表,也就是说这些表里的数据不会真正存放在数据文件里,而是依托内存构建出来的,只存在于内存里。

对于数据字典来说,其概念是非常简单的。我们主要应该掌握如何查找所需要的数据字典,以及跟踪数据字典和动态性能视图的创建方式。