Oracle初始化参数可以分为3类:推导参数、操作系统依赖参数和可变参数。

原文:http://docs.oracle.com/cd/E11882_01/server.112/e40402/initparams001.htm#i1124342

 

推导参数(Derived Parameters)

 

推导参数意思是,这些参数的值来自于其他参数计算的结果,所以这类参数不需要修改,但当用户强行修改该参数时,会覆盖之前运算得出的值。

比如SESSIONS这个参数,缺省情况下由PROCESS运算而来,《DBA入门、进阶与诊断案例》中提到的公式是SESSIONS=(1.1*PROCESSES)+5,不过发现11G以有所改动,实际为SESSIONS=(1.6*PROCESSES)+8。

SQL> show parameter session;
NAME                    TYPE          VALUE
----------------------- -----------   ---------
sessions                integer       248
SQL> show parameter process;
NAME                    TYPE          VALUE
----------------------- -----------   -------
processes               integer       150
$vi initorcl.ora
*.processes=200
SQL> show parameter processes;
NAME                    TYPE          VALUE
----------------------- -----------   ---------
processes               integer       200
SQL> show parameter session;
NAME                    TYPE          VALUE
----------------------- -----------   ---------
sessions                integer       328

操作系统依赖参数(Operating System-Dependent Parameters)

 

这类参数的有效值或者取值范围受限于操作系统。比如:DB_BLOCK_BUFFERS表明主存中的buffers的数量,其最大值受系统参数的影响,而DB_BLOCK_SIZE则依赖于系统块的默认值。

 

可变参数(Variable Parameters)

 

可变参数通常是看调整的,有些设置是限制条件,如OPEN_CURSORS,假如该参数值为10,当用户尝试在自己的会话中打开第11个游标时,返回错误。但有些限制性的参数如DB_BLOCK_BUFFERS,虽然可能因超出限制而使得数据库工作缓慢,但不会阻止工作进行。

 

初始化参数的其它分类方式

 

按照修改方式的划分,初始化参数又可以分为静态参数和动态参数。

静态参数仅在参数文件(pfile)中修改,重启后设置生效。

动态参数可以随时调整,调整后看即时生效。

 

按照获取方式不同,初始化参数又可以分为显示参数和隐藏参数。

显示参数可以通过V$PARAMETER查询获取,而隐藏参数通常以'_'开头,查询需通过数据库基表获取。

 

初始化参数的获取

 

上面已经提到一般初始化参数的获取方式,包括V$PARAMETER视图,以及通过SHOW PARAMETER 'pararmeters_name' (这里的parameters_name支持模糊匹配)命令查看。通过SQL_TRACE跟踪可以发现SHOW PARAMETER语句实际是通过以下语句实现:

SELECT NAME NAME_COL_PLUS_SHOW_PARAM,DECODE(TYPE,1,'boolean',2,'string',3,
  'integer',4,'file',5,'number',        6,'big integer', 'unknown') TYPE,
  DISPLAY_VALUE VALUE_COL_PLUS_SHOW_PARAM 
FROM
 V$PARAMETER WHERE UPPER(NAME) LIKE UPPER(:NMBIND_SHOW_OBJ) ORDER BY 
  NAME_COL_PLUS_SHOW_PARAM,ROWNUM

:NMBIND_SHOW_OBJ 注意这里用的绑定变量,如果我替换成'%SGA%' 就与SHOW PARAMETER等效。

 

而通过对以上语句的进一步查询解释,可以看到V$PARAMETER是通过对以下基表的查询获取的:

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'),
       decode(bitand(ksppilrmflg / 268435456, 1), 1, 'TRUE', 'FALSE'),
       ksppdesc,
       ksppstcmnt,
       ksppihash
  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)));

而这些基表查询中是过滤了'_'开头的参数(translate(ksppinm, '_', '#') not like '##%'),也就是说不显示隐藏参数。

 

相反的,如果我要查询隐藏参数,则通过以下语句查询:

set line 300
col nam for a30
col value for a25
select ksppinm name,
       ksppstvl value,
       ksppstdf isdefault,
       decode(bitand(ksppstvf, 7), 1, 'MODIFIED', 4, 'SYSTEM_MOD', 'FALSE') ismod,
       decode(bitand(ksppstvf, 2), 2, 'TRUE', 'FALSE') isadj
  from x$ksppi x, x$ksppcv y
 where x.indx = y.indx
   and x.indx = userenv('Instance')
   and y.indx = userenv('Instance')
   and x.indx = y.indx
   and ((translate(ksppinm, '__', '#') like '##%') or
       (translate(x.ksppinm, '_', '#') like '#%'))
 order by translate(x.ksppinm, '_', '');