應用Oracle latch分類

 隱含參數_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版本,之前其他版本可能會有不同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章