Oracle 动态视图


在oracle运维的过程中,经常会使用到一些以V$开头的动态视图,比如V$session, 有一次偶然看到有人用V_$session, 初以为别人写错了,没想到desc v_$session以后能看到和v$session一样的结构,再以后又发现以gv$开头的视图等等。趁这次在一台Linux系统上装oracle的机会,终于弄清楚了这些动态视图与相应表之间的关系。

  这些都是由oracle自己管理的数据结构,得从v$fixed_table入手:

  [oracle@3857 admin]$ sqlplus sys/sys@archdw as sysdba

  SQL*Plus: Release 11.2.0.1.0 Production on Mon Dec 14 11:27:20 2009

  Copyright (c) 1982, 2009, Oracle.  All rights reserved.

  Connected to:

  Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 – Production

  With the Partitioning, OLAP, Data Mining and Real Application Testing options

  SQL> desc v$fixed_table;

  Name                                      Null?    Type

  —————————————– ——– —————————-

  NAME                                               VARCHAR2(30)

  OBJECT_ID                                          NUMBER

  TYPE                                               VARCHAR2(5)

  TABLE_NUM                                          NUMBER

  SQL> select * from v$fixed_table

  NAME                            OBJECT_ID TYPE   TABLE_NUM

  —————————— ———- —– ———-

  X$KQFTA                        4294950912 TABLE          0

  X$KQFVI                        4294950913 TABLE          1

  GV$PROCESS                     4294951256 VIEW       65537

  V$PROCESS                      4294950917 VIEW       65537

  GV$BGPROCESS                   4294951257 VIEW       65537

  ………………………………………

  从上面可以看到GV$与V$是视图,X$是表。那它们之间是什么关系呢?从另一个视图v$fixed_view_definition中得到如下信息(以v$fixed_table为例):

  SQL> set linesize 100

  SQL> col view_name for a15

  SQL> col view_definition for a80

  SQL> select * from v$fixed_view_definition where view_name=’V$FIXED_TABLE’;

  VIEW_NAME            VIEW_DEFINITION

  ———————-      ——————————————————————————–

  V$FIXED_TABLE     select  NAME , OBJECT_ID , TYPE , TABLE_NUM from GV$FIXED_TABLE where inst_id =

  USERENV(’Instance’)

  SQL> select * from v$fixed_view_definition where view_name=’GV$FIXED_TABLE’;

  VIEW_NAME               VIEW_DEFINITION

  ————————-     ——————————————————————————–

  GV$FIXED_TABLE    select inst_id,kqftanam, kqftaobj, ‘TABLE’, indx from x$kqfta union all select i

  nst_id,kqfvinam, kqfviobj, ‘VIEW’, 65537 from x$kqfvi union all select inst_id,k

  qfdtnam, kqfdtobj, ‘TABLE’, 65537 from x$kqfdt

  原来gv$是全局视图,而v$是针对某个实例的视图,$X是所有gv$的数据来源,从gv$到v$需要加上where inst_id = USERENV(’Instance’)。一般来说一个oracle数据库只会有一个实例对其操作,但在RAC上可以有多台实例同时装载并打开一个数据库,在RAC上得到的结果是:

  etl@ALIDW> select distinct inst_id from gv$session;

  INST_ID

  ———-

  1

  2

  4

  3

  这rac上有四个实例。嗯,再次加深了对实例与数据库的理解。

  那gv_$与v_$的定义又在什么地方呢?原来在$ORACLE_HOME/rdbms/admin存放着系统管理脚本,在catalog.sql中发现:

  –CATCTL -S    Initial scripts single process

  @@cdstrt

  @@cdfixed.sql

  @@cdcore.sql

  –CATCTL -M

  @@cdplsql.sql

  @@cdsqlddl.sql

  …………………………………………………………………………….

  进一步在cdfixed.sql中找到

  create or replace view v_$fixed_table as select * from v$fixed_table;

  create or replace public synonym v$fixed_table for v_$fixed_table;

  grant select on v_$fixed_table to select_catalog_role;

  create or replace view gv_$fixed_table as select * from gv$fixed_table;

  create or replace public synonym gv$fixed_table for gv_$fixed_table;

  grant select on gv_$fixed_table to select_catalog_role;

  …………………………………………………………………………………………………………….

  [oracle@3857 admin]$ sqlplus sys/sys@archdw as sysdba

  SQL> select * from user_role_privs;

  USERNAME                       GRANTED_ROLE                   ADM DEF OS_

  —————————— —————————— — — —

  SYS                            SELECT_CATALOG_ROLE            YES YES NO

  因此我们常用的v$ 是v_$的同义词,v_$是基于真正的视图v$,而真正的v$视图是在gv$的基础上限制inst_id得到;

  我们常用的gv$是gv_$的同义词,gv_$基于真正的视图gv$,而真正的gv$视图基于系统表X$

在oracle运维的过程中,经常会使用到一些以V$开头的动态视图,比如V$session, 有一次偶然看到有人用V_$session, 初以为别人写错了,没想到desc v_$session以后能看到和v$session一样的结构,再以后又发现以gv$开头的视图等等。趁这次在一台Linux系统上装oracle的机会,终于弄清楚了这些动态视图与相应表之间的关系。

  这些都是由oracle自己管理的数据结构,得从v$fixed_table入手:

  [oracle@3857 admin]$ sqlplus sys/sys@archdw as sysdba

  SQL*Plus: Release 11.2.0.1.0 Production on Mon Dec 14 11:27:20 2009

  Copyright (c) 1982, 2009, Oracle.  All rights reserved.

  Connected to:

  Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 – Production

  With the Partitioning, OLAP, Data Mining and Real Application Testing options

  SQL> desc v$fixed_table;

  Name                                      Null?    Type

  —————————————– ——– —————————-

  NAME                                               VARCHAR2(30)

  OBJECT_ID                                          NUMBER

  TYPE                                               VARCHAR2(5)

  TABLE_NUM                                          NUMBER

  SQL> select * from v$fixed_table

  NAME                            OBJECT_ID TYPE   TABLE_NUM

  —————————— ———- —– ———-

  X$KQFTA                        4294950912 TABLE          0

  X$KQFVI                        4294950913 TABLE          1

  GV$PROCESS                     4294951256 VIEW       65537

  V$PROCESS                      4294950917 VIEW       65537

  GV$BGPROCESS                   4294951257 VIEW       65537

  ………………………………………

  从上面可以看到GV$与V$是视图,X$是表。那它们之间是什么关系呢?从另一个视图v$fixed_view_definition中得到如下信息(以v$fixed_table为例):

  SQL> set linesize 100

  SQL> col view_name for a15

  SQL> col view_definition for a80

  SQL> select * from v$fixed_view_definition where view_name=’V$FIXED_TABLE’;

  VIEW_NAME            VIEW_DEFINITION

  ———————-      ——————————————————————————–

  V$FIXED_TABLE     select  NAME , OBJECT_ID , TYPE , TABLE_NUM from GV$FIXED_TABLE where inst_id =

  USERENV(’Instance’)

  SQL> select * from v$fixed_view_definition where view_name=’GV$FIXED_TABLE’;

  VIEW_NAME               VIEW_DEFINITION

  ————————-     ——————————————————————————–

  GV$FIXED_TABLE    select inst_id,kqftanam, kqftaobj, ‘TABLE’, indx from x$kqfta union all select i

  nst_id,kqfvinam, kqfviobj, ‘VIEW’, 65537 from x$kqfvi union all select inst_id,k

  qfdtnam, kqfdtobj, ‘TABLE’, 65537 from x$kqfdt

  原来gv$是全局视图,而v$是针对某个实例的视图,$X是所有gv$的数据来源,从gv$到v$需要加上where inst_id = USERENV(’Instance’)。一般来说一个oracle数据库只会有一个实例对其操作,但在RAC上可以有多台实例同时装载并打开一个数据库,在RAC上得到的结果是:

  etl@ALIDW> select distinct inst_id from gv$session;

  INST_ID

  ———-

  1

  2

  4

  3

  这rac上有四个实例。嗯,再次加深了对实例与数据库的理解。

  那gv_$与v_$的定义又在什么地方呢?原来在$ORACLE_HOME/rdbms/admin存放着系统管理脚本,在catalog.sql中发现:

  –CATCTL -S    Initial scripts single process

  @@cdstrt

  @@cdfixed.sql

  @@cdcore.sql

  –CATCTL -M

  @@cdplsql.sql

  @@cdsqlddl.sql

  …………………………………………………………………………….

  进一步在cdfixed.sql中找到

  create or replace view v_$fixed_table as select * from v$fixed_table;

  create or replace public synonym v$fixed_table for v_$fixed_table;

  grant select on v_$fixed_table to select_catalog_role;

  create or replace view gv_$fixed_table as select * from gv$fixed_table;

  create or replace public synonym gv$fixed_table for gv_$fixed_table;

  grant select on gv_$fixed_table to select_catalog_role;

  …………………………………………………………………………………………………………….

  [oracle@3857 admin]$ sqlplus sys/sys@archdw as sysdba

  SQL> select * from user_role_privs;

  USERNAME                       GRANTED_ROLE                   ADM DEF OS_

  —————————— —————————— — — —

  SYS                            SELECT_CATALOG_ROLE            YES YES NO

  因此我们常用的v$ 是v_$的同义词,v_$是基于真正的视图v$,而真正的v$视图是在gv$的基础上限制inst_id得到;

  我们常用的gv$是gv_$的同义词,gv_$基于真正的视图gv$,而真正的gv$视图基于系统表X$


« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3