同義詞:物件的別名與跨 Schema 橋樑
核心概念
- 同義詞為資料庫物件提供替代名稱
- 簡化跨 Schema 存取:
SELECT * FROM scott.dept → SELECT * FROM dept (建立同義詞後)
- 支援 TABLE、VIEW、SEQUENCE、PROCEDURE、FUNCTION、PACKAGE、TYPE 等物件
兩類同義詞
| 類型 | 建立者 | 可見性 | 權限需求 |
| Private (預設) | 任意用戶 | 僅建立者可用 | 需對象物件權限 |
| Public | DBA / CREATE PUBLIC SYNONYM | 所有用戶可用 | 需對象物件權限 + PUBLIC 同義詞權限 |
建立與管理語法
-- Private 同義詞
CREATE SYNONYM dept FOR scott.dept;
DROP SYNONYM dept;
-- Public 同義詞
CREATE PUBLIC SYNONYM dept FOR scott.dept;
DROP PUBLIC SYNONYM dept;
實戰場景
- 應用解耦:程式碼寫死同義詞名,切換後端 Schema 僅改同義詞指向
- 遷移過渡:舊表名保留同義詞指向新表,零代碼變更上線
- 簡化權限:授權同義詞而非基表,隱藏真實 Schema 結構
序列:分散式唯一值生成器
核心特性
- 獨立於交易,不回滾:即使交易回滾,序列值已消耗不再重用
- 高併發安全:內部鎖機制保證唯一性
- 可正向/反向、循環/不循環、緩存/不緩存
建立語法全參數
CREATE SEQUENCE my_seq
START WITH 1 -- 起始值
INCREMENT BY 1 -- 遞增量 (負值為遞減)
MINVALUE 1 -- 最小值
MAXVALUE 999999999999 -- 最大值
CACHE 20 -- 記憶體預取數量 (效能關鍵)
NOCYCLE -- 到達極值不循環 (預設)
ORDER; -- 保證跨實例順序 (RAC 必加,單實例可省)
使用方法
-- 取得下一值 (每次呼叫遞增)
SELECT my_seq.NEXTVAL FROM dual;
-- 查看當前值 (僅當 Session 已呼叫過 NEXTVAL)
SELECT my_seq.CURRVAL FROM dual;
關鍵行為驗證
-- 測試:回滾不回收序列值
SELECT my_seq.NEXTVAL FROM dual; -- 返回 1
ROLLBACK;
SELECT my_seq.NEXTVAL FROM dual; -- 返回 2 (非 1!)
-- 測試:重啟資料庫後 CURRVAL 失效
-- 需先呼叫 NEXTVAL 再用 CURRVAL
管理操作
-- 修改遞增量
ALTER SEQUENCE my_seq INCREMENT BY 5;
-- 修改其他屬性 (MAXVALUE, CACHE, CYCLE 等)
ALTER SEQUENCE my_seq MAXVALUE 9999999999999999 CACHE 100;
-- 查看序列定義
SELECT * FROM user_sequences WHERE sequence_name = 'MY_SEQ';
-- 重設序列 (需刪除重建或特殊技巧)
-- 技巧:ALTER SEQUENCE INCREMENT BY -val; SELECT NEXTVAL; ALTER SEQUENCE INCREMENT BY 1;
效能優化:CACHE 參數科學設定
| 場景 | CACHE 值 | 理由 |
| 高併發 OLTP 主鍵 | 100-1000 | 減少序列鎖爭用,容忍間隙 |
| 單據編號、發票號 (需連續) | NOCACHE | 避免重啟/實例故障導致間隙 |
| RAC 環境 | CACHE + ORDER | ORDER 保證全域順序,CACHE 減少跨實例協調 |
| 低頻批次 | 20 (預設) | 平衡預取與間隙 |
同義詞 + 序列組合拳:應用透明主鍵生成
-- 1. 核心 Schema 建立序列
CREATE SEQUENCE core_seq START WITH 1 CACHE 100;
-- 2. 建立 Public 同義詞
CREATE PUBLIC SYNONYM core_seq FOR core_schema.core_seq;
-- 3. 應用端統一呼叫
INSERT INTO orders (order_id, ...) VALUES (core_seq.NEXTVAL, ...);
-- 即使 orders 表在不同 Schema,同樣可用 core_seq.NEXTVAL
避坑指南
- ❌ 序列用於「無間隙」業務單號 → 序列本質有間隙 (回滾、重啟、緩存失效)
- ❌ RAC 環境無 ORDER 導致主鍵亂序 → 必加 ORDER
- ❌ Public 同義詞過多導致命名衝突 → 命名規範:
syn_<schema>_<object>
- ❌ 同義詞指向被刪除物件 → 定期清理無效同義詞
SELECT * FROM dba_synonyms WHERE table_owner NOT IN (SELECT username FROM dba_users)
- ✅ 關鍵序列設定監控:
SELECT sequence_name, cache_size, last_number FROM dba_sequences WHERE cache_size > 100
同義詞以「別名」消除硬編碼耦合,序列以「單調遞增」解決分散式唯一性。兩者結合,構建靈活可擴展的資料庫物件存取與主鍵生成基礎設施。