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

Oracle 列遷移與列鏈結根因分析、偵測腳本與修復標準流程

     編輯:Oracle 資料庫基礎

資料儲存在資料塊中,塊空間管理不當直接導致列遷移、列鏈結,拖垮 I/O 效能。本文提供從根因到修復的完整 SOP。

一、根因機制

  • Row Migration:UPDATE 使行變長,塊剩餘空間不足 → 整行移新塊,原塊留 Rowid 指標。
    主因:PCTFREE 過低 或 平均行長估算不準。
  • Row Chaining:單行 > 塊大小 (LONG/RAW/LOB/超寬行) → 強制跨塊儲存。
    主因:DB_BLOCK_SIZE 過小 或 設計有巨大欄位。

二、標準修復六步驟

  1. 收集資訊:ANALYZE TABLE target_table LIST CHAINED ROWS; (結果存 CHAINED_ROWS 表)。
  2. 識別對象:SELECT * FROM CHAINED_ROWS WHERE TABLE_NAME = 'TARGET_TABLE';
  3. 建立中介表:
    CREATE TABLE INT_TARGET_TABLE AS
    SELECT * FROM TARGET_TABLE
    WHERE ROWID IN (SELECT HEAD_ROWID FROM CHAINED_ROWS WHERE TABLE_NAME='TARGET_TABLE');
  4. 清除原表問題行:
    DELETE FROM TARGET_TABLE
    WHERE ROWID IN (SELECT HEAD_ROWID FROM CHAINED_ROWS WHERE TABLE_NAME='TARGET_TABLE');
  5. 回寫修復行:
    INSERT INTO TARGET_TABLE SELECT * FROM INT_TARGET_TABLE;
  6. 清理與驗證:
    DROP TABLE INT_TARGET_TABLE;
    DELETE FROM CHAINED_ROWS WHERE TABLE_NAME='TARGET_TABLE';
    ANALYZE TABLE TARGET_TABLE LIST CHAINED ROWS;
    SELECT * FROM CHAINED_ROWS WHERE TABLE_NAME='TARGET_TABLE';

    若仍有行 → 屬列鏈結 → 增大 DB_BLOCK_SIZE (需重建庫) 或垂直拆分大欄位。

三、預防配置指引

參數建議設定說明
PCTFREE10~20 (OLTP)預留更新空間,防遷移
PCTUSED40 (配合 PCTFREE)控制塊重入 Freelist 門檻
DB_BLOCK_SIZE8K/16K (現代標準)容納較大行,減少鏈結
LMT + ASSM啟用自動段空間管理,取代 Freelist

四、關鍵提醒

  1. 修復操作會產生大量 Redo/Undo,安排在維護窗口執行。
  2. ANALYZE ... LIST CHAINED ROWS 在大表上耗時長,可改用 DBMS_STATS 採樣模式 (11g+)。
  3. LOB 欄位建議用 ENABLE STORAGE IN ROW (≤ 4KB) 或移至獨立 LOB 表空間。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved