1. 程式人生 > >sequence cache設定 對RAC效能影響

sequence cache設定 對RAC效能影響

此文章為翻譯轉譯文章:

環境 : 11g 64位 2節點的RAC

開發同事每次上程式碼的時候,建立sequence都是指定“no cache”。長期下來效能很慢。下面分析下:

如果指定CACHE值,Oracle就可以預先在記憶體裡面放置一些Sequence,這樣存取的快些。cache裡面的取完後,Oracle自動再取一組到cache。使用cache或許會跳號, 比如資料庫突然不正常down掉(shutdown abort),cache中的Sequence就會丟失。舉個例子:比如你的sequence中cache 100,那當你sequence取到90時突然斷電,那麼在你重啟資料庫後,sequence的值將從101開始。

如果指定NOCACHE值,Oracle就不會預先在記憶體裡面存放Sequence,當然這也就可以避免資料庫不正常down掉的sequence丟失。不過會產生一些問題:建立nocache sequence在高併發訪問時,容易導致row cache lock等待事件,主要原因是每次獲取nextval時都需要修改rowcache中的字典資訊。使用nocache sequence,還會導致如下問題:

由於每次修改字典資訊都需要commit,可能導致log file sync等待,nocache sequence在RAC環境下,會對基於sequence生成的列建立的索引造成例項間大量索引塊爭用。基於以上問題,避免建立nocache sequence。

再來看看sequence相關保護機制:
row cache lock:在呼叫sequence.nextval情況下需要修改資料字典時發生,對應row cache lock事件
SQ lock:在記憶體快取(並非rowcache)上獲取sequence.nextval時發生,對應enq:SQ-contention事件
SV lock:RAC環境下獲取cache+order屬性的sequence.nextval時發生,對應DFS lock handle事件

所以在RAC環境下儘量避免 no cache.

=========================================

在RAC環境中,序列的Cache問題可能會對效能有著決定性的影響,預設的序列Cache值為20,這對RAC環境遠遠不夠。
如果存在序列號使用的競爭,就可能在資料庫中看到明顯的佇列等待:
enq: SQ - contention

在RAC情況下,可以將使用頻繁的序列Cache值增加到10000,或者更高到50000,這些值在客戶的環境中都有采用。
這是RAC設定和RAC使用的基本常識,不可或忘。

在以下測試中,可以顯示Cache序列對於效能的影響:

摘要如下:
RAC兩個會話分別處於不同node同時併發迴圈間斷去取4萬個值 :
nocache:    2100s
cache =1000:   55s
差別卻是好大。

單Instance資料庫單會話迴圈不間斷去1-4萬個值 測試(在家裡筆記本上測試結果)過程如下:
nocache: 37.7s 10000   
cache :20 4.31s 10000
cache :100 2.92s 10000
cache :1000 5.56s 40000
nocache: 97.7s 40000
基本上cache 大於20的時候效能基本可以接受,最好設定100以上,
nocache的時候效能確實很差,最大相差20倍.

排 序引數:oracle預設是NOORDER,如果設定為ORDER;在單例項環境沒有影響,在RAC環境此時,多例項實際快取相同的序列,此時在多個例項 併發取該序列的時候,會有短暫的資源競爭來在多例項之間進行同步。因次效能相比noorder要差,所以RAC環境非必須的情況下不要使用ORDER,尤 其要避免NOCACHE ORDER組合;

在某些版本中存在BUG,會導致過度的 enq : SQ 競爭。
如在Oracle Database 11g中存在 IDGEN$ 序列 cache 設定過小問題,可能導致嚴重競爭,建議增加該序列的Cache值設定。