1. 程式人生 > >Oracle:序列 SEQUENCE 建立語法與使用

Oracle:序列 SEQUENCE 建立語法與使用

序列是oracle資料庫物件一種。多個使用者可以通過序列生成連續的數字以此來實現主鍵欄位的自動、唯一增長,並且一個序列可為多列、多表同時使用。序列消除了序列化並且提高了應用程式一致性。

建立序列:需要有CREATE SEQUENCE或者CREATE ANY SEQUENCE許可權

CREATE SEQUENCE 語法:

CREATE SEQUENCE [ schema. ]sequence

[ { INCREMENT BY | START WITH } integer

{ MAXVALUE integer | NOMAXVALUE }

{ MINVALUE integer | NOMINVALUE }

{ CYCLE | NOCYCLE }

{ CACHE integer | NOCACHE }

{ ORDER | NOORDER }

];

CREATE SEQUENCE引數:

Schema:指定在哪個使用者的schema下建立sequence,預設當前使用者。

Sequence:指定要建立的sequence序列名

INCREMENT BY:指定序列增長步長。可以為正(升序)、負整數(降序),但不能為0。最高精度28。Default間隔預設為1。

絕對值必須小於MAXVALUE與MINVALUE的差異(如非在此區間報錯:ORA-04005: INCREMENT must be less than MAXVALUE minus MINVALUE)。

START WITH:指定序列起始數。預設為序列最小值1開始。

MaxValue:指定序列的最大值。整數值最多28位。必須大於等於起始值且大於等於序列最小值。

NOMAXVALUE:無最大值(實際升序為10^27或降序-1)。default

MINVALUE:指定序列的最小值。整數值最多28位。必須小於等於起始值且小於等於序列最大值。

如此處不符,報:ORA-04006: START WITH cannot be less than MINVALUE。不指定此引數時,預設是1.

NOMINVALUE:無最小值(實際為升序1或降序-10^26)。Default

CYCLE:指定序列達到最大值或最小值後繼續從頭開始生成。

NOCYCLE:不迴圈生成。Default

CACHE:指定資料庫記憶體中預分配的序列值個數,以便快速獲取。最多28位、最小cache值為2。最大值計算公式是:(CEIL (MAXVALUE - MINVALUE)) / ABS (INCREMENT);

不在範圍會報錯:ORA-04013: number to CACHE must be less than one cycle)。

如果系統發生故障,所有快取的沒有被DML語句使用並提交的序列值將丟失。潛在丟失值數量等於cache的數量,將會導致序列不連續。ORACLE建議在RAC中使用CACHE來提高效能。

NOCACHE:指定該序列值不被預分配。如果省略CACHE和NOCACHE,資料庫預設會快取20個序列號。

ORDER:只有在RAC環境時需要指定,指定order條件保證序列按請求順序生成。在使用序列號做為一個時間戳時很有用。

NOORDER:不保證序列按請求順序生成,這是預設的。

注意:如果只指定預設無引數序列為create sequence schema.sequence_name將啟動一個從1開始,以1為單位遞增,沒有最大值限制的遞增序列。

如果要建立一個沒有約束的序列,遞增序列時:忽略MAXVALUE引數或指定NOMAXVALUE;遞減序列:省略MINVALUE引數或指定NOMINVALUE。

如果要建立一個有限制的序列,遞增序列時:指定MAXVALUE引數;遞減序列:指定MINVALUE引數。此時序列達到限制後會報錯:

如果要建立一個有限制的序列在達到限制後重新啟動,指定MAXVALUE和MINVALUE後,還需要指定CYCLE。如果不指定MINVALUE,預設為NOMINVALUE,這個值是1.

使用序列

序列生成的是一系列整數數字.一個序列中包含兩個"偽列" ,分別為"Currval"和"Nextval",可以分別用來獲取該序列的當前值和下一個值.

雖然我們在定義時指定序列初始值為1但並沒有真正初始化該值. 當在檢索序列的當前值前,必須通過檢索序列的下一個值即Nextval來對序列進行

初始化操作.在選擇了Nextval時,該序列就被初始化為1.

使用sequence時對系統性能大致有以下影響:

1.Seq$基表是記錄系統sequence的資料字典表.每次呼叫nextval,會遞迴呼叫更新並COMMIT Seq$基表。

2.更新Seq$基表並提交會產生redo log--幾百位元組,COMMIT頻繁會造成LGWR的壓力;過多redo log生成,造成LGWR壓力、恢復時費時等。

3.多個會話使用sequence可能出現爭用,等待事件row lock contention

對於nocache/cache引數:

nocache:每次使用nextval,都會更新Seq$基表並COMMIT。

cache:只有在記憶體中cache的序列號使用完後才會重新獲取sequence,才會更新Seq$基表並提交。

比如cache設定為2000,則在使用sequence時對效能影響比nocache小上千倍。

所以一般情況下,建議設定一個較大的cache值,用於進行效能的優化。(預設不指定nocache時是20)

ORACLE sequence修改:

ALTER SEQUENCE [ schema. ]sequence

{ INCREMENT BY integer

{ MAXVALUE integer | NOMAXVALUE }

{ MINVALUE integer | NOMINVALUE }

{ CYCLE | NOCYCLE }

{ CACHE integer | NOCACHE }

{ ORDER | NOORDER }

}

修改時的三個注意事項:

如果要使序列start with不同的數字,只能刪除序列重建。

如果修改的maxvalue必須大於序列當前值。

如果在使用NEXTVAL初始化序列前改變INCREMENT BY的值,一些序列號會被跳過。解決跳過問題的方法--刪除重建

修改的各個引數的新值依然要滿足create sequence各引數介紹中的描述。

ORACLE sequence刪除:

DROP SEQUENCE [ schema. ]sequence_name ;