首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 10g Sequence序列管理全攻略:創建、使用與優化

     編輯:Oracle 資料庫基礎

什麼是Sequence

SEQUENCE是Oracle提供的自動生成唯一序列號的數據庫對象,常用於主鍵生成、單據編號等有序號碼場景。每次調用NEXTVAL自動遞增,支持緩存機制提升性能。

一、 創建序列 CREATE SEQUENCE

需具備CREATE SEQUENCE或CREATE ANY SEQUENCE權限。

標準語法示例

CREATE SEQUENCE emp_sequence
  INCREMENT BY 1       -- 步長,可負數(遞減序列)
  START WITH 1         -- 起始值
  NOMAXVALUE           -- 無上限(或 MAXVALUE 999999)
  NOCYCLE              -- 到達極值不循環(或 CYCLE 循環)
  CACHE 10;            -- 內存預取10個值,提升性能

關鍵參數詳解

參數默認值說明
INCREMENT BY1正數遞增、負數遞減,不可為0
START WITH1 / -1遞增序列默認1,遞減默認-1
MAXVALUE / NOMAXVALUENOMAXVALUE遞增上限1027-1,遞減上限-1
MINVALUE / NOMINVALUENOMINVALUE遞減下限-1026,遞增下限1
CYCLE / NOCYCLENOCYCLE循環會從MINVALUE/MAXVALUE重新開始,主鍵場景禁用
CACHE / NOCACHECACHE 20預分配內存,實例異常關閉導致間隙(跳號)
ORDER / NOORDERNOORDERRAC環境強制順序生成,單實例無影響

二、 使用序列:NEXTVAL 與 CURRVAL

  • emp_sequence.NEXTVAL:遞增並返回新值(首次調用返回START WITH值)。
  • emp_sequence.CURRVAL:返回當前會話最後生成的值(必須先調用過NEXTVAL,否則報ORA-08002)。

允許使用的位置

  • 無子查詢/快照/視圖的SELECT列表
  • INSERT的VALUES子句或子查詢
  • UPDATE的SET子句

實戰示例

-- 插入新員工,主鍵自動取序列值
INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
VALUES (emp_sequence.NEXTVAL, 'LEWIS', 'CLERK', 7902, SYSDATE, 1200, NULL, 20);

-- 查詢剛插入的序列值
SELECT emp_sequence.CURRVAL FROM DUAL;

⚠️ 關鍵注意事項

  1. 單語句多次NEXTVAL值不同:INSERT ... VALUES (seq.NEXTVAL, seq.NEXTVAL)會產生兩個連續號碼。
  2. CACHE導致跳號:SHUTDOWN ABORT或實例崩潰會丟失緩存值。關鍵業務(如發票號)建議NOCACHE。
  3. 序列與事務無關:回滾不回退序列值,間隙不可避免。

三、 修改序列 ALTER SEQUENCE

需為擁有者或具備ALTER ANY SEQUENCE權限。不可修改START WITH,需DROP重建。

ALTER SEQUENCE emp_sequence
  INCREMENT BY 10
  MAXVALUE 10000
  CYCLE
  NOCACHE;

四、 刪除序列

DROP SEQUENCE order_seq;

五、 相關初始化參數

SEQUENCE_CACHE_ENTRIES:控制可同時緩存的序列數量(實例級)。

性能優化建議

  • 高併發插入場景:適當增大CACHE(如1000),減少序列鎖競爭。
  • RAC環境:使用ORDER保證全局有序,或採用CACHE + NOORDER配合應用層邏輯接受間隙。
  • 審計要求連續無間隙:勿用Sequence,改用MAX(id)+1串行化或單獨序列表+行鎖。

總結

Sequence是Oracle高性能主鍵生成的首選。理解CACHE與NOCACHE的權衡、CYCLE的風險、RAC下ORDER的代價,能讓你在設計時做出正確選型。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved