数据字典由4部分组成:内部RDBMS(X$)表,数据字典表,动态性能(V$)视图,数据字典视图
第一部分:内部RDBMS(X$)表
X$表用于跟踪数据库信息,维持数据库的正常运行,X$表是加密的,是由oracle公司建立的技术机密。Oralce通过这些V$表建立起大量的视图,便于用户查询和管理数据库.
由于X$表的特殊性,只允许sysdba身份进行查询,非sysdba的用户会出错:
SQL> show user
USER is "SYS"
SQL> grant select on x$ksppi to scott;
grant select on x$ksppi to scott
*
ERROR at line 1:
ORA-02030: can only select from fixed tables/views
如果想要研究X$表的话,可以使用autotrace功能。例如:
SQL> set autotrace trace explain
SQL> select * from v$parameter;
Execution Plan
----------------------------------------------------------
Plan hash value: 1128103955
------------------------------------------------------------------------------
| Id |Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------
| 0 | SELECTSTATEMENT | | 1 | 926 | 1 (100)| 00:00:01 |
|* 1 | HASH JOIN | | 1 | 926 | 1 (100)| 00:00:01 |
|* 2 | FIXED TABLE FULL| X$KSPPI | 1| 249 | 0 (0)| 00:00:01 |
| 3 | FIXED TABLE FULL| X$KSPPCV | 100 | 67700 | 0 (0)| 00:00:01 |
------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 -access("X"."INDX"="Y"."INDX")
filter(TRANSLATE("KSPPINM",'_','#') NOT LIKE '#%' OR
"KSPPSTDF"='FALSE' OR BITAND("KSPPSTVF",5)>0)
2 -filter("X"."INST_ID"=USERENV('INSTANCE') AND
TRANSLATE("KSPPINM",'_','#')NOT LIKE '##%')
SQL> set autotrace off
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10gEnterpriseEdition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 -Production
CORE 10.2.0.1.0 Production
TNS for Linux: Version 10.2.0.1.0 -Production
NLSRTL Version 10.2.0.1.0 -Production
SQL>select kvittag,kvitval,kvitdsc from x$kvit; {该视图记录的是和实例相关的内容}
ksbcpu 1 number oflogical CP
Us in thesystem use
d by Oracle
ksbcpucore 0 number ofphysical C
PU cores inthe syst
em used byOracle
ksbcpusock 0 number ofphysical C
et PU sockets inthe sy
stem used byOracle
ksbcpu_hwm 1 high watermark of n
umber of CPUsused b
y Oracle
ksbcpucore 0 high watermark of n
_hwm umber of CPUcores o
n system
ksbcpusock 0 high watermark of n
et_hwm umber of CPUsockets
on system
ksbcpu_act 1 number ofavailable
ual CPUs in the system
ksbcpu_dr 1 CPU dynamicreconfig
urationsupported
kcbnbh ### number ofbuffers
kcbldq 25 large dirtyqueue if
kcbclwreaches this
kcbfsp 40 Max percentageof LR
U list foreground ca
n scan forfree
kcbcln 2 Initialpercentage o
f LRU list tokeep c
lean
kcbnbf ### number bufferobject
s
kcbwst 0 Flag thatindicates
recovery or dbsuspe
nsion
kcteln 0 Error LogNumber for
thread open
kcvgcw 0 SGA: opcodefor chec
kpointcross-instanc
e call
kcvgcw 0 SGA:opcode forpq ch
eckpointcross-insta
nce call
17 rows selected.
第二部分:数据字典表
数据字典表是以$结尾的通过运行脚本sql.bsp创建。该脚本位于$ORALCE_HOME/rdbms/admin目录下。
[oracle@localhost admin]$ strings sql.bsq|grep undo
查询与undo字段相关的信息,如下:
create table undo$ /* undosegment table */
( us# number not null, /* undo segment number */
name varchar2("M_IDEN") notnull, /* name of this undo segment */
undosqn number, /* highest undo block sequencenumber */
ugrp# number, /* The undo group itbelongs to */
undofile# number, /* undo_off segment file number (status is OFFLINE) */
undoblock# number, /* undo_off segment header filenumber */
/* 0x10 = undo tablespace */
/* 0x200 = undo retention guarantee */
defgrp# number, /* default undogroup */
第三部分:动态性能视图
动态性能(V$)视图记录数据库运行信息和统计信息,用于实时更新。
(1) V$视图和GV$视图
每个V$视图都是基于GV$视图的.例如:
SQL> select inst_id,instance_name,status,version from gv$instance;
INST_ID INSTANCE_NAME STATUS VERSION
---------- ---------------- ------------ -----------------
1 law OPEN 10.2.0.1.0
使用v$instance视图查询:
SQL> select instance_number,instance_name,status from v$instance;
INSTANCE_NUMBER INSTANCE_NAME STATUS
--------------- ---------------- ------------
1 law OPEN
SQL> select view_definition from v$fixed_view_definition whereview_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 whereview_name='GV$FIXED_TABLE';
VIEW_DEFINITION
--------------------------------------------------------------------------------
select inst_id,kqftanam, kqftaobj, 'TABLE', indx from x$kqfta union allselect i
nst_id,kqfvinam, kqfviobj, 'VIEW', 65537 from x$kqfvi union all selectinst_id,k
qfdtnam, kqfdtobj, 'TABLE', 65537 from x$kqfdt
从查询结果看出:GV$FIXED_TABLE是基于X$视图创建的。
我们可以这样理解:先产生X$视图,接着是GV$视图,最后产生V$视图。
(2) GV_$,V_$视图和V$,GV$同义词
在GV$和V$之后,Oracle建立了GV_$和V_$视图,并为这些视图创建了公共同义词。这些工作通过catalog.sql脚本创建。(脚本位于$ORACLE_HOME/rdbms/admin/)
也就是说:v_$视图可以直接授权,而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> ed
Wrote file afiedt.buf
1* grant select on v_$sga toscott
SQL> /
Grant succeeded.
也就是说我们经常访问的v$视图其实大部分是v_$视图的同义词。
注:oracle进行数据访问时,先访问view,后访问同义词。
第四部分:数据字典视图
在X$表和数据字典表之上创建的视图,由脚本catalog.sql创建(位于$ORACLE_HOME/rdbms/admin/)
根据前缀不同分为:
*USER_视图,包含的是用户所拥有的相关对象信息
*ALL_视图:包含用户有权限访问的所有对象的信息
*DBA_视图:包含了数据库所有相关对象的信息
这一部分请看本人博客:http://blog.youkuaiyun.com/woqiang68/article/details/8897616
通常,X$表的信息可以通过v$fixed_table查询.
SQL> select count(*) from v$fixed_table where name like 'X$%';
COUNT(*)
----------
613
同理:
SQL> ed
Wrote file afiedt.buf
1* select count(*) fromv$fixed_table where name like 'V$%'
SQL> /
COUNT(*)
----------
396