首先Oracle的字典表和视图基本上可以分为三个层次
X$表
这一部分表是Oracle数据库的运行基础在数据库启动时由Oracle应用程序动态创建
这部分表对数据库来说至关重要所以Oracle不允许SYSDBA之外的用户直接访问显示授权不被允许
如果显示授权你会收到如下错误:
SQL> grant select on x$ksppi to eygle;
grant select on x$ksppi to eygle
*
ERROR at line :
ORA: can only select from fixed tables/views
GV$和V$视图
从Oracle开始GV$视图开始被引入其含义为Global V$
除了一些特例以外每个V$视图都有一个对应的GV$视图存在
GV$视图的产生是为了满足OPS环境的需要在OPS环境中查询GV$视图返回所有实例信息而每个V$视图基于GV$视图增加了INST_ID列判断后建立只包含当前连接实例信息
注意每个V$视图都包含类似语句
where inst_id = USERENV(Instance)
用于限制返回当前实例信息
我们从GV$FIXED_TABLE和V$FIXED_TABLE开始
SQL> select view_definition from v_$fixed_view_definition where view_name=V$FIXED_TABLE;
VIEW_DEFINITION
select NAME OBJECT_ID TYPE TABLE_NUM from GV$FIXED_TABLE where inst_id = USERENV(Instance)
这里我们看到V$FIXED_TABLE基于GV$FIXED_TABLE创建
SQL> select view_definition from v_$fixed_view_definition where view_name=GV$FIXED_TABLE;
VIEW_DEFINITION
select inst_idkqftanam kqftaobj TABLE indx from x$kqfta
union all
select inst_idkqfvinam kqfviobj VIEW from x$kqfvi
union all
select inst_idkqfdtnam kqfdtobj TABLE from x$kqfdt
这样我们找到了GV$FIXED_TABLE视图的创建语句该视图基于X$表创建
GV_$V_$视图和V$GV$同义词
这些视图是通过catalogql创建
当catalogsql运行时:
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;
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;
我们注意到第一个视图V_$和GV_$首先被创建v_$和gv_$两个视图
然后基于V_$视图的同义词被创建
所以实际上通常我们访问的V$视图其实是指向V_$视图的同义词
而V_$视图是基于真正的V$视图(这个视图是基于X$表建立的)
而v$fixed_view_definition视图是我们研究Oracle对象关系的一个入口仔细理解Oracle的数据字典机制有助于深入了解和学习Oracle数据库知识
再进一步
X$表
关于X$表其创建信息我们也可以从数据字典中一窥究竟
首先我们考察bootstrap$表该表中记录了数据库启动的基本及驱动信息
SQL> select * from bootstrap$;
LINE# OBJ# SQL_TEXT
CREATE ROLLBACK SEGMENT SYSTEM STORAGE ( INITIAL K NEXT K MINEXTENTS M
CREATE CLUSTER C_FILE#_BLOCK#(TS# NUMBERSEGFILE# NUMBERSEGBLOCK# NUMBER)
CREATE INDEX I_FILE#_BLOCK# ON CLUSTER C_FILE#_BLOCK# PCTFREE INITRANS MAXT
CREATE TABLE SEG$(FILE# NUMBER NOT NULLBLOCK# NUMBER NOT NULLTYPE# NUMBE
CREATE TABLE CLU$(OBJ# NUMBER NOT NULLDATAOBJ# NUMBERTS# NUMBER NOT NULL
CREATE CLUSTER C_TS#(TS# NUMBER) PCTFREE PCTUSED INITRANS MAXTRANS
CREATE INDEX I_TS# ON CLUSTER C_TS# PCTFREE INITRANS MAXTRANS STORAGE (
这部分信息在数据库启动时最先被加载跟蹤数据库的启动过程我们发现数据库启动的第一个动作就是:
create table bootstrap$ ( line# number not null obj#
number not null sql_text varchar() not null) storage (initial
K objno extents (file block ))
这部分代码是写在Oracle应用程序中的在内存中创建了bootstrap$以后Oracle就可以从file block 上读取其他信息创建重要的数据库对象从而根据这一部分信息启动数据库这就实现了数据库的引导类似于操作系统的初始化 这部分你可以参考biti_rainy的文章
X$表由此建立这一部分表可以从v$fixed_table中查到
SQL> select count(*) from v$fixed_table where name like X$%;
COUNT(*)
共有个X$对象被记录
GV$和V$视图
X$表建立以后基于X$表的GV$和V$视图得以创建
这部分视图我们也可以通过查询V$FIXED_TABLE得到
SQL> select count(*) from v$fixed_table where name like GV$%;
COUNT(*)
这一部分共个对象
SQL> select count(*) from v$fixed_table where name like V$%;
COUNT(*)
同样是个对象
v$fixed_table共记录了:
+ + 共 个对象
我们通过V$PARAMETER视图来追蹤一下数据库的架构:
SQL> select view_definition from v$fixed_view_definition a where aVIEW_NAME=V$PARAMETER;
VIEW_DEFINITION
select NUM NAME TYPE VALUE ISDEFAULT ISSES_MODIFIABLE ISSYS_MODIFIA
BLE ISMODIFIED ISADJUSTED DESCRIPTION UPDATE_COMMENT from GV$PARAMETER wh
ere inst_id = USERENV(Instance)
我们看到V$PARAMETER是由GV$PARAMETER创建的
SQL> select view_definition from v$fixed_view_definition a where aVIEW_NAME=GV$PARAMETER;
VIEW_DEFINITION
select xinst_idxindx+ksppinmksppityksppstvlksppstdf decode(bitand(kspp
iflg/)TRUEFALSE) decode(bitand(ksppiflg/)IMMEDIATE
DEFERRED IMMEDIATEFALSE) decode(bit
and(ksppstvf)MODIFIEDSYSTEM_MODFALSE) decode(bitand(ksppstvf)
TRUEFALSE) ksppdesc ksppstcmnt from x$ksppi x x$ksppcv y where (xi
ndx = yindx) and ((translate(ksppinm_#) not like #%) or (ksppstdf = F
ALSE))
在这里我们看到GV$PARAMETER来源于x$ksppix$ksppcv两个X$表 x$ksppix$ksppcv 基本上包含所有数据库可调整参数v$parameter展现的是不包含_开头的参数以_开头的参数我们通常称为隐含参数一般不建议修改但很多因为功能强大经常使用而广为人知