1. 程式人生 > >1oracle 自增長 2Oracle Sequence中Cache與NoCache的區別

1oracle 自增長 2Oracle Sequence中Cache與NoCache的區別

一、oracle 自增長
ORACLE是不能用IDENTITY,可以用SEQUENCE
oracle中sequence就是所謂的序列號,每次取的時候它會自動增加,一般用在需要按序列號排序的地方。 1、Create Sequence 你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE許可權,  
CREATE SEQUENCE emp_sequence 
 INCREMENT BY 1 -- 每次加幾個 
 START WITH 1 -- 從1開始計數 
 NOMAXvalue -- 不設定最大值 
 NOCYCLE -- 一直累加,不迴圈  
 CACHE 10; --設定快取cache個序列,如果系統down掉了或者其它情況將會導致序列不連續,也可以設定為---------NOCACHE
由於oracle是序列型的,所以不是在建表的時候遞增的,可以用以下方法:


針對S_Depart建立的sequence如下:


1、先建表:
create table mytable0813
(
id int not null,
name varchar(256)
)
2、建立一個SEQUENCE
  create sequence SEQ_D
  minvalue 1
  maxvalue 99999999
  start with 21
  increment by 1
  cache 20;
補充問題: Oracle Sequence中Cache與NoCache的區別 (放最後)

3、在向表插資料時插入自增列
  insert into mytable0813 values(SEQ_D,'欄位值',...)  
例如:insert into mytable0813(id,name)values(SEQ_D.Nextval,'12345');
二、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在高併發訪問時,容易導致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事件

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

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

轉自 
oracle中有identity列嗎?怎麼實現自增長?_yuzhili_新浪部落格
http://blog.sina.com.cn/s/blog_62b080970100o5h6.html
Oracle Sequence中Cache與NoCache的區別 - 學而時習之 - 部落格頻道 - CSDN.NET
http://blog.csdn.net/duanning397/article/details/7670302