15.未公开的Oracle数据库秘密笔记——X$固定表介绍

来源:互联网 发布:点云数据 编辑:程序博客网 时间:2024/05/22 15:27

15.未公开的Oracle数据库秘密笔记——X$固定表介绍

欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50383214

官方文档对一些X$表有所提及,但是绝大多数在文档中是查不到的。

很多X$表相比于构建在其之上的GV$视图容纳了更多的信息。GV$或V$视图提供的信息就是不充分的,要详查其底层的X$表。很多X$表示不作为GV$视图的基表的。

1.  X$固定表与C语言

ORACLE数据库管理系统的内核代码,即使不是全部,至少重要的部分使用C语言编写的。

V$视图背后的基本思路是使数据库管理员了解到C语言数据结构。

通过中间层将V$视图映射到C语言数据结构实现的。

一些X$表示与磁盘存储相关的。例如X$固定表X$KCCDC的列DCNAM,保存了通过RMAN命令COPY DATAFILE创建的数据文件副本的路径名。

         任何设计优良的特性都有一个以上的命名方式。例如AUM(自动撤销管理),也称为SMU(系统管理撤销)

2.  分层系统结构

X$表名遵循严格的命名规则,其中几个字母代表了ORACLE内核中的一个层或者模块。例如

KC表示内核缓存(Kernel Cache),KT表示内核事务(KernelTransaction)

如下图1


3.  从V$视图到X$固定表

V$视图展示的信息是一个限制性因素的情况。

新版本中显示了X$表中越来越多的信息,但有些时间还有必要从X$表中搜集更多的信息。

4.  从V$PARAMETER到X$表

文档中未做说明的参数以下划线“_”开头。

可以通过V$FIXED_VIEW_DEFINITION视图来查看实例中所有V$,GV$视图以及X$表的信息库。

例如探究视图V$PARAMETER得到如下信息:

idle> col view_definition format a80 word_wrapped

idle> select view_definition fromv$fixed_view_definition where view_name='V$PARAMETER';

 

VIEW_DEFINITION

--------------------------------------------------------------------------------

select       NUM, NAME , TYPE , VALUE , DISPLAY_VALUE, DEFAULT_VALUE, ISDEFAULT ,

ISSES_MODIFIABLE , ISSYS_MODIFIABLE ,ISPDB_MODIFIABLE , ISINSTANCE_MODIFIABLE,

ISMODIFIED , ISADJUSTED , ISDEPRECATED,ISBASIC, DESCRIPTION, UPDATE_COMMENT,

HASH, CON_ID  from GV$PARAMETER where inst_id =USERENV('Instance')

进一步执行如下:

idle> select view_definition from v$fixed_view_definitionwhere view_name='GV$PARAMETER';

 

VIEW_DEFINITION

--------------------------------------------------------------------------------

selectx.inst_id,x.indx+1,ksppinm,ksppity,ksppstvl, ksppstdvl, ksppstdfl,

ksppstdf, decode(bitand(ksppiflg/256,1),1,'TRUE','FALSE'),

decode(bitand(ksppiflg/65536,3),1,'IMMEDIATE',2,'DEFERRED',

3,'IMMEDIATE','FALSE'), decode(bitand(ksppiflg/524288,1),1,'TRUE','FALSE'),

decode(bitand(ksppiflg,4),4,'FALSE',

decode(bitand(ksppiflg/65536,3), 0,'FALSE', 'TRUE')),

decode(bitand(ksppstvf,7),1,'MODIFIED',4,'SYSTEM_MOD','FALSE'),

decode(bitand(ksppstvf,2),2,'TRUE','FALSE'),  decode(bitand(ksppilrmflg/64, 1),

1, 'TRUE', 'FALSE'),  decode(bitand(ksppilrmflg/268435456, 1), 1,'TRUE',

'FALSE'), ksppdesc, ksppstcmnt, ksppihash, x.con_id  from x$ksppi x, x$ksppcv y

where (x.indx = y.indx) and  bitand(ksppiflg,268435456) = 0 and

((translate(ksppinm,'_','#') not like'##%') and   ((translate(ksppinm,'_','#')

not like '#%')        or (ksppstdf = 'FALSE')or    (bitand(ksppstvf,5) > 0)))

可以看到一些常用的X$表。

5.  参看文档中隐藏参数

查看文档中未作说明的参数(隐藏参数),如下:

-- SET MARKUP HTML ON SPOOL ON HEAD'<title>Oracle10g Hidden Parameters</title>'

set pages 9999

set lines 140

col name format a45

col value format a25 word_wrapped

col description format a45 word_wrapped

set trimspool on

set trimout on

SELECT

  x.ksppinmname,

  y.ksppstvlVALUE, /*,

 decode(ksppity,

    1,   'BOOLEAN',

    2,   'STRING',

    3,   'INTEGER',

    4,   'PARAMETER FILE',

    5,   'RESERVED',

    6,   'BIG INTEGER',

    'UNKNOWN')typ,

 decode(ksppstdf,

   'TRUE',   'DEFAULT VALUE',

   'FALSE',   'INIT.ORA') isdefault,

 decode(bitand(ksppiflg / 256,  1),

    1,   'IS_SESS_MOD(TRUE)',

    'FALSE')isses_modifiable,

 decode(bitand(ksppiflg / 65536,  3),

    1,   'MODSYS(NONDEFERED)',

    2,   'MODSYS(DEFERED)',

    3,   'MODSYS(*NONDEFERED*)',

    'FALSE')issys_modifiable,

 decode(bitand(ksppstvf,   7),

    1,   'MODIFIED_BY(SESSION)',

    4,   'MODIFIED_BY(SYSTEM)',

    'FALSE')is_modified,

 decode(bitand(ksppstvf,   2),

    2,   'ORA_STARTUP_MOD(TRUE)'

    'FALSE')is_adjusted,*/

  ksppdescdescription

  --,ksppstcmnt update_comment

FROM x$ksppi x,

  x$ksppcv y

WHERE x.inst_id = userenv('Instance')

 AND y.inst_id= userenv('Instance')

 AND x.indx =y.indx

and substr(x.ksppinm,1,1)='_'

order by 1

;

Exit

6.  X$表和V$视图关系

查看任意X$固定表上层的V$视图?

通过在V$视图上执行SELECT语句从V$SQL_PLAN视图中获取底层X$表的名称。最后任务是在一个表中保存V$视图与X$表的联系。

代码如下:

DROP TABLE x_v_assoc;

 

CREATE TABLE x_v_assoc (

        x_idnumber,

        v_idnumber);

 

*/

set serveroutput on size 1000000

declare

        CURSORv_views IS SELECT name, object_id FROM v$fixed_table WHERE name like 'V$%'ORDER BY name;

        CURSORplan_curs(p_hash_value number) IS SELECT DISTINCT nvl(object#, -1) object#,object_name

        FROMv$sql_plan

        WHEREhash_value=p_hash_value

        ANDoperation LIKE 'FIXED TABLE%';

       prev_hash_value number;

       object_name varchar2(30);

       v_cursor integer;

        resultinteger;

       object_id number;

begin

        FORv_rec IN v_views LOOP

               BEGIN

                       dbms_output.put_line(v_rec.name);

                        v_cursor :=dbms_sql.open_cursor;

                        -- parse and execute astatement that selects from the v$ view but returns no rows

                       dbms_sql.parse(v_cursor, 'SELECT * FROM '||v_rec.name||' WHERErownum=0', dbms_sql.native);

                       result:=dbms_sql.execute_and_fetch(v_cursor);

                        -- get hash value ofprevious statement, i.e. select from v$view

                        SELECT prev_hash_valueINTO prev_hash_value

                        FROM v$session

                        WHEREaudsid=userenv('sessionid')

                        AND rownum=1; -- justin case several child cursors exist, prev_child_number not available in 9i

                       dbms_output.put_line('prev_hash_value: '||prev_hash_value);

                       dbms_sql.close_cursor(v_cursor);

                        FOR plan_rec INplan_curs(prev_hash_value) LOOP

                                -- object_namemay have this format: X$KEWMEVMV (ind:1

-- object_id is NULL for fixed tables

                               result:=instr(plan_rec.object_name, ' ');

                                IF result >0 THEN

                                       object_name:=substr(plan_rec.object_name,1,result-1);

                                ELSE

                                       object_name:=plan_rec.object_name;

                                END IF;

                                SELECTobject_id INTO object_id FROM v$fixed_table WHERE name=object_name;

                                IF SQL%NOTFOUNDTHEN

                                       dbms_output.put_line('object_id for '||object_name||' not found inV$FIXED_TABLE');

                                ELSE

                                       dbms_output.put_line(' '||object_name||': '||object_id);

                                END IF;

                                INSERT INTO x_v_assoc(x_id,v_id) VALUES(object_id, v_rec.object_id);

                        END LOOP;

               EXCEPTION WHEN OTHERS THEN

                       dbms_output.put_line(dbms_utility.format_error_stack);

               END;

        ENDLOOP;

end;

/

commit;

 

spool x_views

set lines 140

set trimout on

set trimspool on

break on x_name noduplicates

-- x$ tables used by v$ views

SELECT

f1.name x_name,

f2.name v_name

FROM x_v_assoc a, v$fixed_table f1, v$fixed_table f2

WHERE a.x_id=f1.object_id

AND a.v_id=f2.object_id

ORDER BY x_name;

clear breaks

 

break on v_name noduplicates

-- v$views and underlying x$ tables

SELECT

f1.name v_name,

f2.name x_name

FROM x_v_assoc a, v$fixed_table f1, v$fixed_table f2

WHERE a.v_id=f1.object_id

AND a.x_id=f2.object_id

ORDER BY v_name;

 

spool off

会创建表X_V_assoc,然后查询如下:

sys@ORCL> select f1.name x_name,f2.name v_namefrom x_v_assoc a,v$fixed_table f1,v$fixed_table f2 where a.x_id=f1.object_id

    anda.v_id=f2.object_id order by x_name;

获得V$视图底层的X$固定表的列表如下:

sys@ORCL> select f1.name x_name,f2.name v_namefrom x_v_assoc a,v$fixed_table f1,v$fixed_table f2 where a.v_id=f1.object_id

    and a.x_id=f2.object_idorder by x_name;

 

 

7.  常用的X$表

 

X$KGLLK,X$KSPPI, X$KSPPCV,X$BH,X$KSLED, X$KFFXP

 

 

 

 

 

 

 

 

 

 

 

 

 

0 0