Oracle动态性能视图

动态性能(V$)视图(Dynamic Performance View) 记录DB运行时信息和统计数据,大部分动态性能视图通过实时更新表中的数据来反映数据库当前的状态。

 

GV$和V$视图

数据库启动时,Oracle动态的创建X$表,并在此基础上创建GV$和V$视图,GV$视图全称Global View,除一些特列,每个V$都有一个对应的GV$视图的存在。

 

对比GV$和V$视图的差异

SQL> desc v$instance
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 INSTANCE_NUMBER                                    NUMBER
 INSTANCE_NAME                                      VARCHAR2(16)
 HOST_NAME                                          VARCHAR2(64)
 VERSION                                            VARCHAR2(17)
 STARTUP_TIME                                       DATE
 STATUS                                             VARCHAR2(12)
 PARALLEL                                           VARCHAR2(3)
 THREAD#                                            NUMBER
 ARCHIVER                                           VARCHAR2(7)
 LOG_SWITCH_WAIT                                    VARCHAR2(15)
 LOGINS                                             VARCHAR2(10)
 SHUTDOWN_PENDING                                   VARCHAR2(3)
 DATABASE_STATUS                                    VARCHAR2(17)
 INSTANCE_ROLE                                      VARCHAR2(18)
 ACTIVE_STATE                                       VARCHAR2(9)
 BLOCKED                                            VARCHAR2(3)
SQL> desc gv$instance
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 INST_ID                                            NUMBER
 INSTANCE_NUMBER                                    NUMBER
 INSTANCE_NAME                                      VARCHAR2(16)
 HOST_NAME                                          VARCHAR2(64)
 VERSION                                            VARCHAR2(17)
 STARTUP_TIME                                       DATE
 STATUS                                             VARCHAR2(12)
 PARALLEL                                           VARCHAR2(3)
 THREAD#                                            NUMBER
 ARCHIVER                                           VARCHAR2(7)
 LOG_SWITCH_WAIT                                    VARCHAR2(15)
 LOGINS                                             VARCHAR2(10)
 SHUTDOWN_PENDING                                   VARCHAR2(3)
 DATABASE_STATUS                                    VARCHAR2(17)
 INSTANCE_ROLE                                      VARCHAR2(18)
 ACTIVE_STATE                                       VARCHAR2(9)
 BLOCKED                                            VARCHAR2(3)

可以看到GV$比V$多一个INST_ID字段,Oracle提供了一些特殊视图记录其他视图的创建方式,如v$fixed_view_definition

SQL> col view_name for a15
SQL> select * from v$fixed_view_definition where view_name='V$INSTANCE';
VIEW_NAME       VIEW_DEFINITION
--------------- ----------------------------------------------------------------------------------------------------
V$INSTANCE      select  INSTANCE_NUMBER , INSTANCE_NAME , HOST_NAME , VERSION , STARTUP_TIME , STATUS , PARALLEL , T
                HREAD# , ARCHIVER , LOG_SWITCH_WAIT , LOGINS , SHUTDOWN_PENDING, DATABASE_STATUS, INSTANCE_ROLE, ACT
                IVE_STATE, BLOCKED from GV$INSTANCE where inst_id = USERENV('Instance')

可以看到V$实际是从GV$中通过WHERE语句过滤出inst_id是当前用户实例的内容

SQL> select * from v$fixed_view_definition where view_name='GV$INSTANCE';
VIEW_NAME       VIEW_DEFINITION
--------------- ----------------------------------------------------------------------------------------------------
GV$INSTANCE     select ks.inst_id,ksuxsins,ksuxssid,ksuxshst,ksuxsver,ksuxstim,decode(ksuxssts,0,'STARTED',1,'MOUNTE
                D',2,'OPEN',3,'OPEN MIGRATE','UNKNOWN'),decode(ksuxsshr,0,'NO',1,'YES',2,NULL),ksuxsthr,decode(ksuxs
                arc,0,'STOPPED',1,'STARTED','FAILED'),decode(ksuxslsw,0,NULL,2,'ARCHIVE LOG',3,'CLEAR LOG',4,'CHECKP
                OINT',       5,'REDO GENERATION'),decode(ksuxsdba,0,'ALLOWED','RESTRICTED'),decode(ksuxsshp,0,'NO','
                YES'),decode(kvitval,0,'ACTIVE',2147483647,'SUSPENDED','INSTANCE RECOVERY'),decode(ksuxsrol,1,'PRIMA
                RY_INSTANCE',2,'SECONDARY_INSTANCE','UNKNOWN'), decode(qui_state,0,'NORMAL',1,'QUIESCING',2,'QUIESCE
                D','UNKNOWN'), decode(bitand(ksuxsdst, 1), 0, 'NO', 1, 'YES', 'NO') from x$ksuxsinst ks, x$kvit kv,
                x$quiesce qu where kvittag = 'kcbwst'

而GV$则是来自于X$表的视图,那么我们在数据库中还看到GV_$和V_$视图是怎么来的?可以通过查看cdfixed.sql这个脚本进行了解。这个脚本被catalog.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;

通过V_$视图,Oracle把V$和普通用户隔离,V_$视图的权限可以授予其他用户,而Oracle不允许直接对V$视图授权

SQL> grant select on v$sga to scott;
grant select on v$sga to scott
                *
ERROR at line 1:
ORA-02030: can only select from fixed tables/views
SQL> grant select on v_$sga to scott;
Grant succeeded.

关于这点看上面的语句cdfixed.sql中展示的语句也可以了解到。那么用户在访问这些对象时,是否存在优先顺序呢?

 

按照ORACLE的创建机制分别创建X$TAB,V$TAB,V_$TAB, 公共同义词V$TAB

sqlplus scott/tiger
SQL> create table x$tab as select 1 as id,'China' as city from dual;
Table created.
SQL> create view v$tab as select * from x$tab;
View created.
SQL> create view v$tab as select * from x$tab;
View created.
SQL> create view v_$tab as select * from v$tab;
View created.
SQL> create public synonym v$tab for v_$tab;
Synonym created.

 在hr用户下访问v$tab提示SCOTT.V_$TABD对象不存在,这里是因为我没有授予hr用户访问scott用户中视图的权限

SQL> desc v$tab;
ERROR:
ORA-04043: object "SCOTT"."V_$TAB" does not exist

授权后正确查询,因为scott用户下创建的是public synonym,所以这里证明我可以正确访问这个公共同义词

SQL> grant select on scott.v_$tab to hr;
Grant succeeded.
sqlplus hr/hr
SQL> desc v$tab
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER
 CITY                                               CHAR(5)

在hr用户下创建v$tab视图,再次访问v$tab,这次可以看到先访问的是hr用户下的v$tab视图

SQL> create view v$tab as select 'China' city from dual;
View created.
SQL> desc v$tab
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 CITY                                               CHAR(5)

以上实验说明同时存在视图与同义词的情况下,用户优先访问视图。

你可能感兴趣的:(oracle,动态性能视图)