隐含参数_SPIN_COUNT用来控制进程在获取latch失败的时候,CPU spin和重试的次数。较大的_SPIN_COUNT值会降低latch获取时的MISSES和SLEEPS值,当然这是以牺牲CPU时间为代价的。有时候,我们可能因为某一个特定的latch需要调整_SPIN_COUNT值。在Oracle9i2之前的版本中,这一改变会应用到所有的latches上,而这一_SPIN_COUNT值并不一定适合其他的latch,甚至可能会造成严重的负面影响。从Oracle9iR2开始,Oracle允许对latch进行分类,每一类可以有不同的_SPIN_COUNT,YIELD,WAITTIME值。如此一来,设置某个特定latch的_SPIN_COUNT值,可以完全不影响到其他latch。
下面是一个latch分类的简单实例。
SQL> select indx, spin, yield, waittime
2 from x$ksllclass;
INDX SPIN YIELD WAITTIME
---------- ---------- ---------- ----------
0 20000 0 1
1 20000 0 1
2 20000 0 1
3 20000 0 1
4 20000 0 1
5 20000 0 1
6 20000 0 1
7 20000 0 1
8 rows selected.
系统默认的8个latch分类,每一个分类对应一个隐含的初始化参数_LATCH_CLASS_n,可以通过修改这些参数来设置各个分类的_SPIN_COUNT值。假设我们需要设置cache buffers chains latch的_SPIN_COUNT=10000。
首先通过V$LATCHNAME视图,得到cache buffers chains的LATCH#。
SQL> select latch#, name
2 from v$latchname
3 where name = 'cache buffers chains';
LATCH# NAME
--------- --------------------------------------------------
122 cache buffers chains
其次,创建init.ora文件(假设初始使用spfile),并修改。
SQL> create pfile from spfile;
File created.
SQL> shutdown immediate
Database closed.
ORACLE instance shut down.
vi $ORACLE_HOME/dbs/initrandy.ora
/*添加如下两行内容*/
_latch_class_1="10000"
_latch_classes="122:1"
SQL> startup pfile='/u01/oracle/product/10.2.0/dbs/initrandy.ora'
这样,就将cache buffers chains从默认的0类修改到1类,并设置1类的_SPIN_COUNT=10000。
最后,我们可以来验证一下。
SQL> select indx, spin, yield, waittime
2 from x$ksllclass;
INDX SPIN YIELD WAITTIME
---------- ---------- ---------- ----------
0 20000 0 1
1 10000 0 1
2 20000 0 1
3 20000 0 1
4 20000 0 1
5 20000 0 1
6 20000 0 1
7 20000 0 1
8 rows selected.
SQL> select a.kslldnam, b.kslltnum, b.class_ksllt
2 from x$kslld a, x$ksllt b
3 where a.kslldadr = b.addr
4 and b.class_ksllt > 0;
KSLLDNAM KSLLTNUM CLASS_KSLLT
-------------------------------------------------- ---------- -----------
process allocation 3 2
cache buffers chains 122 1
SQL> select a.kslldnam, b.kslltnum, b.class_ksllt
2 from x$kslld a, x$ksllt b
3 where a.kslldadr=b.addr and a.kslldnam='cache buffers chains';
KSLLDNAM KSLLTNUM CLASS_KSLLT
-------------------------------------------------- ---------- -----------
cache buffers chains 122 1
以上测试来自Oracle10gR2版本,之前其他版本可能会有不同。