【檢視】深入探究 V$PARAMETER的底層查詢內幕

secooler發表於2010-03-26
查詢資料庫系統引數可以使用“show parameter”,也可以使用V$PARAMETER檢視進行查詢。本文我們使用v$fixed_view_definition檢視輔助獲得V$PARAMETER檢視真正獲得途徑(即探索構造這個檢視的真實的SQL語句和訪問的底層檢視)。

1.使用desc命令檢視一下V$PARAMETER“檢視”列基本資訊
sys@ora10g> desc V$PARAMETER
 Name                      Null?    Type
 ------------------------- -------- ------------------------------
 NUM                                NUMBER
 NAME                               VARCHAR2(80)
 TYPE                               NUMBER
 VALUE                              VARCHAR2(512)
 DISPLAY_VALUE                      VARCHAR2(512)
 ISDEFAULT                          VARCHAR2(9)
 ISSES_MODIFIABLE                   VARCHAR2(5)
 ISSYS_MODIFIABLE                   VARCHAR2(9)
 ISINSTANCE_MODIFIABLE              VARCHAR2(5)
 ISMODIFIED                         VARCHAR2(10)
 ISADJUSTED                         VARCHAR2(5)
 ISDEPRECATED                       VARCHAR2(5)
 DESCRIPTION                        VARCHAR2(255)
 UPDATE_COMMENT                     VARCHAR2(255)
 HASH                               NUMBER

2.使用v$fixed_view_definition檢視得到V$PARAMETER檢視的查詢語句
sys@ora10g> col VIEW_DEFINITION for a70
sys@ora10g> select view_definition from v$fixed_view_definition a where a.VIEW_NAME='V$PARAMETER';

VIEW_DEFINITION
----------------------------------------------------------------------
select  NUM , NAME , TYPE , VALUE , DISPLAY_VALUE, ISDEFAULT , ISSES_M
ODIFIABLE , ISSYS_MODIFIABLE , ISINSTANCE_MODIFIABLE, ISMODIFIED , ISA
DJUSTED , ISDEPRECATED, DESCRIPTION, UPDATE_COMMENT, HASH  from GV$PAR
AMETER where inst_id = USERENV('Instance')

格式化這個SQL語句後的結果:
SELECT NUM,
       NAME,
       TYPE,
       VALUE,
       DISPLAY_VALUE,
       ISDEFAULT,
       ISSES_MODIFIABLE,
       ISSYS_MODIFIABLE,
       ISINSTANCE_MODIFIABLE,
       ISMODIFIED,
       ISADJUSTED,
       ISDEPRECATED,
       DESCRIPTION,
       UPDATE_COMMENT,
       HASH
  FROM GV$PARAMETER
 WHERE inst_id = USERENV ('Instance')
/

可見,V$PARAMETER是透過GV$PARAMETER建立的。

3.繼續追溯GV$PARAMETER的建立語句
sys@ora10g> select view_definition from v$fixed_view_definition a where a.VIEW_NAME='GV$PARAMETER';

VIEW_DEFINITION
----------------------------------------------------------------------
select x.inst_id,x.indx+1,ksppinm,ksppity,ksppstvl, ksppstdvl, ksppstd
f,  decode(bitand(ksppiflg/256,1),1,'TRUE','FALSE'),  decode(bitand(ks
ppiflg/65536,3),1,'IMMEDIATE',2,'DEFERRED',
       3,'IMMEDIATE','FALSE'),  decode(bitand(ksppiflg,4),4,'FALSE',
                                   decode(bitand(ksppiflg/65536,3), 0,
 'FALSE', 'TRUE')),     decode(bitand(ksppstvf,7),1,'MODIFIED',4,'SYST
EM_MOD','FALSE'),  decode(bitand(ksppstvf,2),2,'TRUE','FALSE'),  decod
e(bitand(ksppilrmflg/64, 1), 1, 'TRUE', 'FALSE'),  ksppdesc, ksppstcmn
t, ksppihash  from x$ksppi x, x$ksppcv y where (x.indx = y.indx) and
((translate(ksppinm,'_','#') not like '##%') and    ((translate(ksppin
m,'_','#') not like '#%')      or (ksppstdf = 'FALSE') or      (bitand
(ksppstvf,5) > 0)))

格式化後的SQL:
SELECT x.inst_id,
       x.indx + 1,
       ksppinm,
       ksppity,
       ksppstvl,
       ksppstdvl,
       ksppstdf,
       DECODE (BITAND (ksppiflg / 256, 1), 1, 'TRUE', 'FALSE'),
       DECODE (BITAND (ksppiflg / 65536, 3),
               1, 'IMMEDIATE',
               2, 'DEFERRED',
               3, 'IMMEDIATE',
               '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'),
       ksppdesc,
       ksppstcmnt,
       ksppihash
  FROM x$ksppi x, x$ksppcv y
 WHERE (x.indx = y.indx)
       AND ( (TRANSLATE (ksppinm, '_', '#') NOT LIKE '##%')
            AND (   (TRANSLATE (ksppinm, '_', '#') NOT LIKE '#%')
                 OR (ksppstdf = 'FALSE')
                 OR (BITAND (ksppstvf, 5) > 0)))
/

4.寶貴結果
圖窮匕見,幕後“魁首”終於出現,它們就是“x$ksppi”和“x$ksppcv”兩個X$表。
使用“x$ksppi”和“x$ksppcv”兩個X$表可以完成更多的任務,在下一篇文章中給大家展示一下使用這兩個X$表獲得隱含引數及其描述資訊。

5.日常訪問到的V$PARAMETER是“表”?“檢視”?還是“同名”?
真實身份是“同名”。
論據請檢視catalog.sql建立指令碼中關於該檢視的建立過程。
相關內容引用在此,供參考。
create or replace view v_$parameter as select * from v$parameter;
create or replace public synonym v$parameter for v_$parameter;
grant select on v_$parameter to select_catalog_role;

6.小結
v$fixed_view_definition檢視是研究檢視定義的有效工具,本文透過該檢視追溯到了V$PARAMETER的底層查詢表。
有興趣的朋友可以進一步去研究其他檢視的查詢定義。

Good luck.

secooler
10.03.26

-- The End --

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-630542/,如需轉載,請註明出處,否則將追究法律責任。

相關文章