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, '_', '');