。
遷移/升級時用同義詞屏蔽Schema變更:CREATE SYNONYM old_name FOR new_schema.new_table。
避免同義詞鏈 (A→B→C),增加解析開銷。
序列
屬性全解析
| 屬性 | 語法 | 默認值 | 說明 |
| 起始值 | START WITH n | 1 (升序) / -1 (降序) | 首次NEXTVAL返回值 |
| 增量 | INCREMENT BY n | 1 | 正數升序、負數降序;不可為0 |
| 最小值 | MINVALUE n / NOMINVALUE | 1 / -10^27 | 降序時觸發循環或報錯 |
| 最大值 | MAXVALUE n / NOMAXVALUE | 10^27 / -1 | 升序時觸發循環或報錯 |
| 循環 | CYCLE / NOCYCLE | NOCYCLE | 達極值後是否重新開始;主鍵建議NOCYCLE |
| 緩存 | CACHE n / NOCACHE | 20 | 預分配內存緩存,減少磁盤I/O;RAC下各實例各自緩存導致間隙 |
| 有序 | ORDER / NOORDER | NOORDER | RAC下強制全局有序 (需全局鎖,性能大幅下降),單機無效 |
創建範例
-- 標準主鍵序列 (單機/非RAC)
CREATE SEQUENCE seq_order_id
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 999999999999999999
NOCYCLE
CACHE 100
NOORDER;
-- RAC環境高併發主鍵序列 (間隙可接受)
CREATE SEQUENCE seq_order_id_rac
START WITH 1 INCREMENT BY 1
CACHE 1000 -- 大緩存減少序列鎖爭用
NOORDER NOCYCLE;
-- 業務單號序列 (含日期前綴,應用層拼裝)
CREATE SEQUENCE seq_daily_no
START WITH 1 INCREMENT BY 1
MINVALUE 1 MAXVALUE 99999
CYCLE -- 每日重置需應用層配合
NOCACHE; -- 精確控制
使用與監控
-- 獲取下一值
SELECT seq_order_id.NEXTVAL FROM dual;
-- 查看當前值 (需先在當前Session調用過NEXTVAL)
SELECT seq_order_id.CURRVAL FROM dual;
-- 修改屬性 (不可修改當前值)
ALTER SEQUENCE seq_order_id INCREMENT BY 5;
ALTER SEQUENCE seq_order_id NOCACHE; -- 緊急情況禁用緩存
-- 監控序列狀態
SELECT sequence_name, last_number, cache_size, increment_by, cycle_flag, order_flag
FROM user_sequences
WHERE sequence_name = 'SEQ_ORDER_ID';
RAC下序列間隙問題與對策
| 現象 | 原因 | 對策 |
| NEXTVAL不連續 (如1, 21, 41...) | 各實例緩存20個值,實例重啟/緩存失效導致未用值丟失 | 業務接受間隙;或用ORDER (性能代價大);或NOCACHE (高爭用) |
| 主鍵重複 (極罕見) | 手工ALTER SEQUENCE ... RESTART或MAXVALUE循環 | 嚴禁手工重置;設置極大MAXVALUE;監控last_number接近上限告警 |
遷移與兼容性
- Oracle 12c+
IDENTITY COLUMN:id NUMBER GENERATED ALWAYS AS IDENTITY,內建序列,語法標準、遷移友好。
- PostgreSQL
SERIAL/BIGSERIAL / IDENTITY;MySQL AUTO_INCREMENT;SQL Server IDENTITY — 遷移時需重建序列對象並同步當前值。
同義詞簡化訪問、序列保障唯一。掌握CACHE/ORDER/NOCYCLE三大屬性在RAC下的行為差異,是設計高併發主鍵生成策略的關鍵。
- 上一篇文章: Oracle日期時間函數完全指南:TO_DATE/TO_CHAR格式模型、運算、時區、性能優化
- 下一篇文章: Oracle表插入系統時間最佳實踐:SYSDATE/SYSTIMESTAMP、時區、格式模型、批量綁定
Copyright ©
程式碼之家 All Rights Reserved