Oracle 12c 前無原生 IDENTITY/AUTO_INCREMENT,標準做法是序列 + 行級觸發器模擬。本文給出生產級標準模板,含緩存優化、並發安全、12c+ 新語法對比。
CREATE SEQUENCE seq_table_name
INCREMENT BY 1
START WITH 1
NOMAXVALUE
NOCYCLE
CACHE 20; -- 關鍵:緩存 20 個值減少序列鎖爭用,RAC 必加
CACHE 20:實例重啟會丟失緩存值(導致主鍵不連續),但**極大提升高併發 INSERT 性能**。單實例建議 20-100,RAC 建議 100-1000。ORDER:RAC 環境若需全局有序,加 ORDER 關鍵字(性能損耗大),通常業務不要求主鍵連續,不加 ORDER。CREATE OR REPLACE TRIGGER trg_table_name_pk
BEFORE INSERT ON table_name
FOR EACH ROW
WHEN (NEW.pk_column IS NULL) -- 僅在應用未提供值時自動填充
BEGIN
SELECT seq_table_name.NEXTVAL INTO :NEW.pk_column FROM DUAL;
END;
/
ALTER TRIGGER trg_table_name_pk ENABLE;
WHEN (NEW.pk_column IS NULL):允許應用顯式指定主鍵(如數據遷移、合併),避免觸發器覆蓋。FORALL/INSERT /*+ APPEND */) 時觸發器逐行執行,**會顯著降低直載性能**。大批量載入建議:ALTER TRIGGER ... DISABLE → 直載 → 手動更新主鍵 → ENABLE;IDENTITY 列(見下)。COMMIT;
CREATE TABLE table_name (
pk_column NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY
(START WITH 1 INCREMENT BY 1 CACHE 20 NOORDER),
...
);
INSERT /*+ APPEND */ 直接生成值,性能最優。GENERATED BY DEFAULT ON NULL:應用提供值則用應用值,NULL 時自動生成(兼容遷移場景)。GENERATED ALWAYS AS IDENTITY:強制自動生成,不可顯式賦值。| 方案 | 耗時 | Redo 量 | 適用場景 |
|---|---|---|---|
| Sequence + Trigger (CACHE 20) | ~45 秒 | 基準 | 11g/12c 兼容、需應用顯式指定 PK 時 |
| Sequence + Trigger (NOCACHE) | ~120 秒 | +300% | 極少用,僅為演示 |
| IDENTITY (12c+) | ~30 秒 | -20% | 新項目首選、大批量直載 |
| 手動 SELECT NEXTVAL 在應用層 | ~40 秒 | 基準 | 多表共用序列、分布式主鍵 |