在文章《【视图】深入探究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('%¶m%')
order by name
/
4.脚本使用效果
查询一下包含“shared_pool”关键字的参数信息
sys@ora10g> @parameter
Enter value for param: shared_pool
old 6: and upper(a.ksppinm) LIKE upper('%¶m%')
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 --
为什么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('%¶m%')
order by name
/
4.脚本使用效果
查询一下包含“shared_pool”关键字的参数信息
sys@ora10g> @parameter
Enter value for param: shared_pool
old 6: and upper(a.ksppinm) LIKE upper('%¶m%')
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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/519536/viewspace-630549/