数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Oracle动态视图


发布日期:2019年10月13日
 
Oracle动态视图

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

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

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

SQL*Plus: Release Production on Mon Dec ::

Copyright (c) Oracle All rights reserved

Connected to:

Oracle Database g Enterprise Edition Release – Production

With the Partitioning OLAP Data Mining and Real Application Testing options

SQL> desc v$fixed_table;

Name Null? Type

—————————————– ——– —————————

NAME VARCHAR()

OBJECT_ID NUMBER

TYPE VARCHAR()

TABLE_NUM NUMBER

SQL> select * from v$fixed_table

NAME OBJECT_ID TYPE TABLE_NUM

—————————— ——— —– ———

X$KQFTA TABLE

X$KQFVI TABLE

GV$PROCESS VIEW

V$PROCESS VIEW

GV$BGPROCESS VIEW

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

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

SQL> set linesize

SQL> col view_name for a

SQL> col view_definition for a

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_idkqftanam kqftaobj TABLE indx from x$kqfta union all select i

nst_idkqfvinam kqfviobj VIEW from x$kqfvi union all select inst_idk

qfdtnam kqfdtobj TABLE 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

———

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

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

–CATCTL S Initial scripts single process

@@cdstrt

@@cdfixedsql

@@cdcoresql

–CATCTL M

@@cdplsqlsql

@@cdsqlddlsql

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

进一步在cdfixedsql中找到

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@ 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数据库中联结异构数据

下一篇:ORACLE大数据表Update处理