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

Oracle同義詞與Sequence序列完全指南:私有/公共同義詞、序列屬性、緩存、性能優化

     編輯:Oracle 資料庫基礎

同義詞與序列:簡化訪問路徑、保障主鍵生成唯一性的核心對象

同義詞提供對象別名,屏蔽Schema前綴;序列生成有序唯一整數,支援主鍵、審計ID、業務單號。本文系統講解私有/公共同義詞創建授權、序列屬性詳解、緩存機制、RAC下序列間隙、性能優化與遷移注意點,含實戰代碼模板。

同義詞

類型對比

類型可見性創建權限典型場景
Private僅擁有者CREATE SYNONYM應用Schema簡化跨Schema訪問
Public所有用戶CREATE PUBLIC SYNONYM (需DBA)通用工具包、共享參數表、遷移兼容層

創建與管理

-- 私有同義詞 (當前用戶)
CREATE SYNONYM dept FOR scott.dept;
DROP SYNONYM dept;

-- 公共同義詞 (DBA執行)
CREATE PUBLIC SYNONYM v$session FOR sys.v_$session;
DROP PUBLIC SYNONYM v$session;

-- 查詢同義詞
SELECT * FROM user_synonyms;        -- 私有
SELECT * FROM all_synonyms;         -- 可見
SELECT * FROM dba_synonyms;         -- 全庫 (DBA)

-- 重定向同義詞 (無需DROP)
CREATE OR REPLACE SYNONYM emp FOR hr.employees;

最佳實踐

  • 公共同義詞命名加前綴避免衝突:PUB_。
  • 遷移/升級時用同義詞屏蔽Schema變更:CREATE SYNONYM old_name FOR new_schema.new_table。
  • 避免同義詞鏈 (A→B→C),增加解析開銷。
  • 序列

    屬性全解析

    屬性語法默認值說明
    起始值START WITH n1 (升序) / -1 (降序)首次NEXTVAL返回值
    增量INCREMENT BY n1正數升序、負數降序;不可為0
    最小值MINVALUE n / NOMINVALUE1 / -10^27降序時觸發循環或報錯
    最大值MAXVALUE n / NOMAXVALUE10^27 / -1升序時觸發循環或報錯
    循環CYCLE / NOCYCLENOCYCLE達極值後是否重新開始;主鍵建議NOCYCLE
    緩存CACHE n / NOCACHE20預分配內存緩存,減少磁盤I/O;RAC下各實例各自緩存導致間隙
    有序ORDER / NOORDERNOORDERRAC下強制全局有序 (需全局鎖,性能大幅下降),單機無效

    創建範例

    -- 標準主鍵序列 (單機/非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下的行為差異,是設計高併發主鍵生成策略的關鍵。

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