天天看點

【每日一摩斯】-RAC and Sequences (853652.1)

序列有四種組合:

a. CACHE + NOORDER

b. CACHE + ORDER

c. NOCACHE + NOORDER

d. NOCACHE + ORDER

即使在單例配置下,當有大量的sequence需要産生的時候,性能壓力和存儲sequence值的行鎖定代價相關。

NOCACHE與CACHE的性能

      當使用cache時,dictionary cache(row cache)僅僅當出現新的水位線時才會更新一次。例如當cache是20,nextval第一次請求時,dictionary cache中的sequence的row cache值改變,增加20。DBA_SEQUENCES的LAST_NUMBER字段以cache值或20增加。抽取出存儲于shared pool的20值,将會配置設定給請求nextval的session。v$_sequences(這個表應該不是Oracle官方提出的)允許知道sequence是否已經被緩存于shared

pool中。

      當不使用cache時,dictionary cache不得不對于任何nextval請求都有進行一次更新。意味着row cache不得不随着每次nextval的請求被鎖定和更新。多個session同時請求一個nextval是以将會被block在一個’row cache lock'等待中。

      當使用cache+order和RAC(cluster_database=true)時,需要使用序列中nextval的session需要得到一個排它執行個體SV鎖,在shared pool中插入或更新序列值之前。當多個session同時需要同一個序列時,一些session将會等待'DFS lock handle'等待事件。

      因為這些序列化機制的結果,整個序列,例如可能以最快的速度增長一個序列,不會随着RAC節點的個數擴充,當序列沒有cache+序列order/序列沒有order。相比于沒有cache的序列,cache的序列性能更好。

     由于非cache的order序列的序列化機制,序列的性能不會随着RAC節點個數擴充,例如性能不能提升。甚至性能會随着節點個數降低一些,例如因為要花費更多時間得到一個row cache鎖或SQ入隊列,特别是當參與更多節點時。但從1個節點擴充為2個節點時,性能降低的效果可見,從2個到3個時性能降低的效果也是可見的,但是當有更多的節點加入進來時則趨于平緩。

總結下,序列其實是有順序的,隻是預設是NOORDER,并行伺服器才需要這種順序,如果僅僅将序列作為主鍵不關注順序那還好說。但使用序列也是有争搶的,因為要保證它的唯一性,是以對于并發量很大的系統可以采用CACHE,緩存一部分序列值,減少争搶,但同時需要冒着緩存丢失的風險,就像PCTFREE和PCTUSED這對參數一樣,存在着不可調和的沖突,找到一個平衡點才是關鍵。