1. 程式人生 > >Oracle在建立序列(sequence)時有個引數你可以選擇cache或者nocache

Oracle在建立序列(sequence)時有個引數你可以選擇cache或者nocache

Oracle在建立序列(sequence)時有個引數你可以選擇cache或者nocache,下面來講一下兩者區別:

先來看下建立sequence語句:

create sequence SEQ_ID  
minvalue 1  
maxvalue 99999999  
start with 1  
increment by 1  
cache n  / nocache  --其中n代表一個整數,預設值20
order;

如果指定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在高併發訪問時,容易導致rowcache lock等待事件,主要原因是每次獲取nextval時都需要修改rowcache中字典資訊。使用nocache  sequence,還會導致如下問題:
由於每次修改字典資訊都需要commit,可能導致log file sync等待,nocache sequence在RAC環境下,會對基於sequence生成

列建立索引造成例項間大量索引塊爭用
基於以上問題,避免建立nocache sequence。

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

什麼情況下使用cache什麼時間上使用nocache?

我個人感覺應該儘量使用cache,因現在資料庫很多都是在高併發情況下執行,首先這樣可以搞效能,並且也不會產生rowcache lock等待事件。可能有些人會擔心資料庫不正常down掉會產生序列號間斷,但這也是很少情況。當然如果你業務要求是絕不能產生間斷序列號,那就要使用nochache了。