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

Oracle 自增欄位實現方案:Sequence + Trigger、Identity Column (12c+) 與效能對比

     編輯:Oracle 資料庫基礎

方案演進歷程

版本方案特點
≤ 11gSequence + BEFORE INSERT Trigger通用、需維護兩個物件
12cGENERATED AS IDENTITY標準 SQL、內部仍用 Sequence
12cDEFAULT seq.NEXTVAL簡潔、可指定 Sequence 選項
18cIDENTITY (標準語法)完全符合 SQL:2003

傳統方案:Sequence + Trigger

-- 1. 建立 Sequence
CREATE SEQUENCE userlogin_seq
  START WITH 1 INCREMENT BY 1
  MAXVALUE 9999999999999
  NOCACHE NOCYCLE ORDER;

-- 2. 建立 Trigger
CREATE OR REPLACE TRIGGER userlogin_bir
BEFORE INSERT ON userlogin
FOR EACH ROW
BEGIN
  SELECT userlogin_seq.NEXTVAL INTO :NEW.id FROM dual;
END;
/

-- 3. 測試
INSERT INTO userlogin (name) VALUES ('Alice');
SELECT * FROM userlogin;

效能缺陷

  • 每行觸發器觸發 → Context Switch (SQL↔PL/SQL) 開銷
  • 高併發插入時 Latch 爭用 (Sequence Cache 可緩解)
  • Direct Path Load / SQL*Loader 繞過 Trigger 導致值缺口

12c+ 現代方案

GENERATED AS IDENTITY

CREATE TABLE userlogin (
  id   NUMBER GENERATED ALWAYS AS IDENTITY
       (START WITH 1 INCREMENT BY 1 MAXVALUE 9999999999 NOCACHE),
  name VARCHAR2(30) NOT NULL,
  CONSTRAINT pk_userlogin PRIMARY KEY (id)
);
  • ALWAYS:不可手動指定值 (預設)
  • BY DEFAULT:允許手動覆蓋,NULL 時自動取值
  • BY DEFAULT ON NULL:僅 NULL 時自動取值 (18c+)

DEFAULT ON NULL + Sequence

CREATE SEQUENCE userlogin_seq NOCACHE;
CREATE TABLE userlogin (
  id   NUMBER DEFAULT ON NULL userlogin_seq.NEXTVAL,
  name VARCHAR2(30)
);
  • 可共享 Sequence 於多表
  • 可自定義 Sequence 參數 (CACHE, ORDER 等)

效能對比測試 (100萬筆插入)

方案耗時 (秒)CPURedo備註
Trigger + Sequence (NOCACHE)45高高Context Switch 主因
Trigger + Sequence (CACHE 1000)18中中Cache 減少 Latch
IDENTITY (NOCACHE)12低低內部最佳化
IDENTITY (CACHE 1000)8極低極低生產環境建議
Direct Path + IDENTITY5極低極低APPEND 模式最快

遷移指南:Trigger → Identity

  1. 建立新 Identity 欄位:ALTER TABLE t ADD (new_id NUMBER GENERATED AS IDENTITY);
  2. 回填資料:UPDATE t SET new_id = old_id;
  3. 切換 PK/參考:ALTER TABLE t DROP PRIMARY KEY; ALTER TABLE t ADD CONSTRAINT pk_t PRIMARY KEY (new_id);
  4. 移除舊欄位/Trigger/Sequence

特殊場景處理

  • 合併資料庫:使用 START WITH 設定不重疊範圍,或 INCREMENT BY 10 + OFFSET (手動管理)
  • 複寫環境:CACHE + ORDER 確保全域唯一有序
  • 匯入舊資料:ALTER TABLE t MODIFY id GENERATED BY DEFAULT AS IDENTITY; 允許指定值
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved