您的位置:首页 > 数据库 > Oracle

oracle数据字典深入探究

2013-06-26 20:54 357 查看
数据字典由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.csdn.net/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

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: