首页 > 数据库 > Oracle > 正文

走近Oracle数据字典(二)--动态性能视图

2024-08-29 13:53:44
字体:
来源:转载
供稿:网友
在上篇文章里“走近Oracle数据字典--数据字典表”,我们谈到了数据字典对于我们作为DBA对数据库维护的重要性。数据库的对象信息,比如表,用户,存储过程,函数,视图,索引等等,这些存在在数据库里的对象的信息,都是在数据字典表里进行维护的,我们可以借用一些比较好的Oracle开发工具比如PLSQL dev或者TOAD查看他们,或者直接通过对数据字典表进行sql查询,从而获得对象的信息。 不过在数据库的meta信息里,除了这些对象静态对象的这些信息以为,数据库运行是的一些信息对于我们来说也是非常有帮助的,也更为有意义。 比如,有多少个session,有什么样的PRocess在实例里运行,系统的状态现在是如何的, 可以看到这些信息都是实例运行时的动态信息,不是固定的信息,不同的时刻可能信息也是不一样的, Oracle为了进行维护的时候能够得知这些实例的这些类似状态一样的动态的信息,提供叻动态性能视图,通过这个动态性能视图我们可以了解到实例内部的一些动态变化的状态信息。

动态信息视图也是数据字典的一种,提供信息维护的作用,不过和我们上一个文章提到的“数据字典表”一样也可以在dictionary里找到,开头为v$的都是我们这里提到的动态性能视图。 一样,这个是一个public的同义词,我们以v$session这个大家比较熟悉的视图为例,一起走进去看看。

SQL>  select OWNER,OBJECT_NAME, OBJECT_TYPE from all_objects where object_name = 'V$SESSION';

OWNER                          OBJECT_NAME                    OBJECT_TYPE

------------------------------ ------------------------------ -------------------

PUBLIC                         V$SESSION                      SYNONYM

SQL> select OWNER,SYNONYM_NAME,TABLE_OWNER,TABLE_NAME from dba_synonyms where synonym_name = 'V$SESSION';

OWNER                          SYNONYM_NAME                   TABLE_OWNER                    TABLE_NAME

------------------------------ ------------------------------ ------------------------------ ------------------------------

PUBLIC                         V$SESSION                      SYS                            V_$SESSION

可以看到v$session是一个同义词,指向v_$sesssion, 这个v_$sesssion才是一个视图。

动态性能视图都是以V$开头,对应是以V_$开头的视图。 我们来看看这些V_$视图的定义吧

还记得我吗上篇文章,如何来查看view的基表的语句吧

可以查询dba_views表的text字段

SQL> select view_name,text from dba_views a where a.view_name = 'V_$SESSION';

VIEW_NAME                      TEXT

------------------------------ --------------------------------------------------------------------------------

V_$SESSION                     select "SADDR","SID","SERIAL#","AUDSID","PADDR","USER#",......from v$session

这里可以看到 v_$session是一个视图,他的基表是v$session,这里要注意这个v$session不是上面的同义词了,而是一个和其名字一样的视图或者表。

既然是视图我们再用dba_views来查查这个视图是怎么定义的呀。

SQL> select view_name,text from dba_views a where a.view_name = 'V$SESSION';

VIEW_NAME                      TEXT

------------------------------ --------------------------------------------------------------------------------

发现并没有这个名字的视图,那么在表的里面查查

SQL> select table_name from dba_tables a where a.table_name = 'V$SESSION';

TABLE_NAME

------------------------------

也没有这个对象, 究竟是怎么回事了,这个v$session就是是何物呀, 动态性能视图和数据字典表不一样,动态性能视图不是真正的物理表,而是内存中虚拟出来的表,其实可以看作是Oracle的一部分内存,不过是用表的形式提供信息的,既然是这样的,那么这个v$session当然就不会放到真实的表和视图里了。

对于类似这样的虚拟的内存表的信息,我们可以通过v$fixed_view_defination来查询

SQL> desc v$fixed_view_definition;

Name            Type           Nullable Default Comments

--------------- -------------- -------- ------- --------

VIEW_NAME       VARCHAR2(30)   Y                         

VIEW_DEFINITION VARCHAR2(4000) Y  

SQL> select * from v$fixed_view_definition where view_name = 'V$SESSION';

VIEW_NAME                      VIEW_DEFINITION

------------------------------ --------------------------------------------------------------------------------

V$SESSION                      select  SADDR , SID , SERIAL# , AUDSID , PADDR , USER# , .....  from GV$SESSION where inst_id =USERENV('Instance')

发现这个视图由GV$session定义而成  GV$Session和v$session一样,有是一个虚拟表的视图。

SQL>  select * from v$fixed_view_definition where view_name = 'GV$SESSION';

VIEW_NAME                      VIEW_DEFINITION

------------------------------ --------------------------------------------------------------------------------

GV$SESSION                     select s.inst_id,s.addr,s.indx,s.ksuseser,s.ksuudses,s.ks ..... from x$ksuse s, x$ksled e where bitand(s.ksspaflg,1)!=0 and bitand(s.ksuseflg,1)!=0 and s.ksuSEOpc=e.indx

终于找到最后的源头了,就是这里的X$开头的对象,这里的对象x$开头的就都是我们上面提到的虚拟表,是在内存里的部分,用表的形式展现而已。 Oracle把运行的状态直接构造在内存里,这样不必要去IO一把,而且用表的形式来表现,易于查询。 同时既然是动态部分,那么这个地方是可变化的,数据库停止的时候,这些内存表的信息也就消失叻,直到下次启动,Oracle实例再根据实时的情况进行构造。

大家可以查询一下v$fixed_table这个表,只所以在这里才给大家提出来,就是顾虑大家如果没有区别上面的v$session(synonym),v_$session, v$session, gv$session, x$ksuse的话,直接看这个视图就乱掉了,

现在大家可以查询这个视图了。 这个v$fixed_tables视图就是所有的虚拟视图和表。 也就是 v$session, gv$session, x$ksus这里的三种对象,而v$session(synonym),v_$session是实实在在的对象,所以这个视图里查不到, 这个表里table表示是虚拟表, view表示是虚拟视图。

他们一起构造出我们的性能动态视图。 为什么Oracle不直接的在这些虚拟表上直接就见synonym而是,百转千回的这样绕了一下,大家有兴趣可以思考一下,由于我这里没有确切的答案,所以这个问题仅作为讨论问题,就不在这里阐述叻。

这些动态性能视图对于我们的Oracle DBA对数据库进行管理,比较有意义。是我们DBA对Oracle的实例部分信息进行了解的一种通道。 所以掌握我们这里的重要的动态视图非常的有必要,  下一篇文章, 我将视图 给大家介绍DBA管理中常见的动态性能视图。  通过了解具体的动态视图来看看数据实例里我们关注的信息。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表