在Oracle数据库中,有一系列的初始化参数用来进行数据库约束和资源限制,这些参数通常存储在一个参数文件中,在数据库实例启动时读取并加载。
初始化参数对数据库来说非常重要,很多参数通过合理的调整可以极大地提高数据库性能,下面对数据库参数进行相关探讨,有关参数文件请留意后续文章。
初始化参数的分类
按照得出方式不同,初始化参数可以分为3类:推导参数、操作系统依赖参数和可变参数。
1. 推导参数(Derived Parameters)
推导参数通常来自于其他参数的运算,依赖其他参数得出。所以这类参数通常不需要修改。如果强制修改,那么修改值会覆盖推导值。
常见的此类参数有很多,例如,SESSIONS参数,在Oracle文档中,该参数按一下公式运算得出:
SESSIONS=(1.1XPROCESSES)+5
缺省情况下,当PROCESSES被修改时,此参数会自动计算并生效。
2. 操作系统依赖参数
某些参数的有效值或者取值范围依赖或者受限于操作系统,如db_cache_size参数,设置Oracle使用的内存大小,该参数的最大值就是受限于物理内存。这一类参数通常没称为操作系统依赖参数。
3. 可变参数
可变参数通常可以调整,有些设置的是限制条件,如OPEN_CURSORS;有的参数是设置容量,如DB_CACHE_SIZE等。这类参数通常可以为DBA或最终用户调整,从而产生限制或性能变化,对Oracle至关重要。
初始化参数通常还有一些其他分类方式。
按照修改方式划分,初始化参数又可以分为静态参数和动态参数。
静态参数只能在参数文件中修改,在重新启动后方能生效;动态参数可以动态调整,调整后通常可以立即生效。
按照获取方式不同,初始化参数又可以分为显示参数和隐含参数。
显示参数可以通过v$parameter查询得到;而隐含参数通常以“_”开头,必须通过查询系统表方能获得这些参数。
总之,虽然分类方式不同,但是参数都是这些,我们更多需要了解的是这些参数的用途。
4. 初始化参数的获取
Oracle的初始化参数可以通过v$parameter视图查询得到,在sql*plus之中,经常可以通过show parameter命令来显示某些参数的设置值,例如:
[oracle@czjie ~]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.4.0 - Production on Tue Nov 22 10:12:21 2011
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 218103808 bytes
Fixed Size 1266680 bytes
Variable Size 113249288 bytes
Database Buffers 100663296 bytes
Redo Buffers 2924544 bytes
Database mounted.
Database opened.
SQL> alter session set sql_trace=true;
Session altered.
SQL> show parameter sga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 208M
sga_target big integer 208M
SQL> select u_dump.value || '/' || db_name.value || '_ora_' || v$process.spid || nvl2(v$process.traceid, '_' || v$process.traceid, null )|| '.trc' "Trace File" from v$parameter u_dump cross join v$parameter db_name cross join v$process join v$session on v$process.addr = v$session.paddr where u_dump.name = 'user_dump_dest' and db_name.name = 'db_name' and v$session.audsid=sys_context('userenv','sessionid');
Trace File
--------------------------------------------------------------------------------
/opt/ora10g/admin/ORCL/udump/ORCL_ora_3236.trc
[oracle@czjie ~]$ tkprof /opt/ora10g/admin/ORCL/udump/orcl_ora_3236.trc /opt/ora10g/orcl_ora_3236.txt
TKPROF: Release 10.2.0.4.0 - Production on Tue Nov 22 10:17:19 2011
Copyright (c) 1982, 2007, Oracle. All rights reserved.
通过sql_trace跟踪,可以发现,其实这条命令的本质就是通过如下一条SQL查询得到的:
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('%sga%') ORDER BY
NAME_COL_PLUS_SHOW_PARAM,ROWNUM
通过查询v$parameter视图的创建语句,可以看到,实际上v$parameter视图过滤掉了以“_”开头的一系列参数:
SQL> select * from v$fixed_view_definition where view_name = 'V$PARAMETER' ;
VIEW_NAME VIEW_DEFINITION
------------------------------ --------------------------------------------------------------------------------
V$PARAMETER select NUM , NAME , TYPE , VALUE , DISPLAY_VALUE, ISDEFAULT , ISSES_MODIFIABLE
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')
SQL> select * from v$fixed_view_definition where view_name = 'GV$PARAMETER';
VIEW_NAME VIEW_DEFINITION
------------------------------ --------------------------------------------------------------------------------
GV$PARAMETER select x.inst_id,x.indx+1,ksppinm,ksppity,ksppstvl, ksppstdvl, ksppstdf, decode
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)))
这些以“_”开头的初始化参数通常被称为隐含参数,Oracle通常不建议修改这些参数,但是因为某些隐藏参数有这特殊的功能,逐渐被越来越多的人所熟知。
通过一下查询,可以获得这些隐含参数:
SELECT x.ksppinm NAME,
y.ksppstvl VALUE,
y.ksppstdf isdefault,
decode(bitand(y.ksppstvf, 7), 1, 'MODIFIED', 4, 'SYSTEM_MOD', 'FALSE') ismod,
devode(bitand(y.ksppstvf, 2), 'TRUE', 'FALSE') isadj
FROM sys.x$ksppi x, sys.x$ksppcv y
WHERE x.inst_id = userenv('Instance')
AND y.inst_id = userenv('Instance')
AND x.indx = y.indx
AND x.ksppinm LIKE '%_&par%'
ORDER BY translate(x.ksppinm, '_', '')
常见的几个隐含参数有:
NAME VALUE ISDEFAULT ISMOD ISADJ
------------------------------ ------------------------- --------- ---------- -----
_allow_resetlogs_corruption FALSE TRUE FALSE FALSE
_corrupted_rollback_segments TRUE FALSE FALSE
_offline_rollback_segments TRUE FALSE FALSE
后面的章节中会介绍这几个参数的重要用途。