【指令碼】隱含引數及註釋資訊的查詢方法

secooler發表於2010-03-27
在文章《【檢視】深入探究V$PARAMETER的底層查詢內幕》http://space.itpub.net/519536/viewspace-630542中得到一個重要的結論:構造V$PARAMETER的查詢使用到了兩個X$表,它們是“x$ksppi”和“x$ksppcv”。
為什麼V$PARAMETER只能查詢到“一般”的引數,無法查詢到資料庫的隱含引數(Oracle的隱含引數是以下劃線開頭的引數)?
如何檢視那些隱含引數及它們的說明資訊?
深入研究“x$ksppi”和“x$ksppcv”後,我們便會得到有效地指導,並對上面的問題給出一一的解答。

1.透過“x$ksppi”和“x$ksppcv”構造V$PARAMETER的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)))
/

2.使用V$PARAMETER無法查詢到隱含引數的真實原因
注意觀察SQL語句中的Where子句中有如下的限制:
       AND ( (TRANSLATE (ksppinm, '_', '#') NOT LIKE '##%')
            AND (   (TRANSLATE (ksppinm, '_', '#') NOT LIKE '#%')

就是因為這個限制,導致以下劃線開頭的引數被過濾掉了。

3.查詢隱含引數及其說明資訊方法
既然知道了引數描述資訊的源頭是“x$ksppi”和“x$ksppcv”兩個X$表,我們便可以編寫一個指令碼,使用這個指令碼可以查詢到幾乎所有的系統引數(普通引數和隱含引數)。
簡單編寫指令碼如下:
$ cat parameter.sql
col name for a32
col value for a24
col description for a70
select a.ksppinm name,b.ksppstvl value,a.ksppdesc description
  from x$ksppi a,x$ksppcv b
 where a.inst_id = USERENV ('Instance')
   and b.inst_id = USERENV ('Instance')
   and a.indx = b.indx
   and upper(a.ksppinm) LIKE upper('%&param%')
order by name
/

4.指令碼使用效果
查詢一下包含“shared_pool”關鍵字的引數資訊
sys@ora10g> @parameter
Enter value for param: shared_pool
old   6:    and upper(a.ksppinm) LIKE upper('%&param%')
new   6:    and upper(a.ksppinm) LIKE upper('%shared_pool%')

NAME                             VALUE       DESCRIPTION
-------------------------------- ----------- ----------------------------------------------------------------------
__shared_pool_size               2466250752  Actual size in bytes of shared pool
_dm_max_shared_pool_pct          1           max percentage of the shared pool to use for a mining model
_enable_shared_pool_durations    TRUE        temporary to disable/enable kgh policy
_io_shared_pool_size             4194304     Size of I/O buffer pool from SGA
_shared_pool_max_size            0           shared pool maximum size when auto SGA enabled
_shared_pool_minsize_on          FALSE       shared pool minimum size when auto SGA enabled
_shared_pool_reserved_min_alloc  4400        minimum allocation size in bytes for reserved area of shared pool
_shared_pool_reserved_pct        5           percentage memory of the shared pool allocated for the reserved area
shared_pool_reserved_size        142606336   size in bytes of reserved area of shared pool
shared_pool_size                 0           size in bytes of shared pool

10 rows selected.


5.小結
在瞭解原理的基礎上,深入一下,很多縈繞在心頭的問題便會迎刃而解,隨之而來的就是豁然開朗之悅。
想一想還有沒有其他的收穫。

Good luck.

secooler
10.03.27

-- The End --

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

相關文章