匯入效能瓶頸分析
IMP 耗時主要來自:I/O 等待、Redo/Undo 產生、索引維護、約束檢查、提交頻率。針對三個層面調優可縮短 50%~80% 耗時。
一、系統層調整 (需停機/重啟)
| 調整項 | 建議 | 原理 |
| DB_BLOCK_SIZE | 盡可能大 (8K/16K/32K) | 單位 I/O 傳輸更多資料,減少 I/O 次數 |
| 大型 Rollback Segment | 建立單一大 Rollback (~最大表 50%),其餘 OFFLINE | 減少擴展/縮減爭用,配合 COMMIT=N |
| NOARCHIVELOG 模式 | 匯入期間關閉歸檔 | 避免歸檔日誌產生與切換開銷 |
| 大型 Redo Log Files | 多組大尺寸 (如 1GB+),關閉小檔 | 減少 Log Switch 頻率與 Checkpoint 衝擊 |
| 分離 I/O | Rollback、Data、Redo 分置不同磁碟/控制器 | 消除 I/O 爭用 |
二、init.ora / SPFILE 參數調整
| 參數 | 建議值 | 說明 |
| LOG_CHECKPOINT_INTERVAL | > 最大 Redo Log 檔案大小 (OS blocks) | 僅在 Log Switch 觸發 Checkpoint,最小化 Checkpoint 開銷 |
| SORT_AREA_SIZE | 依記憶體調大 (如 50MB~200MB) | 加速索引建立、ORDER BY 排序,避免磁碟排序 |
| DB_WRITER_PROCESSES | CPU 核心數 | 加速髒塊寫入 |
三、IMP 參數選項優化
imp system/password \
FILE=full.dmp \
FULL=Y \
BUFFER=104857600 \ -- 100MB 緩衝,視記憶體調整
COMMIT=N \ -- 每表結束才 COMMIT,需大 Rollback 支撐
INDEXES=N \ -- 先不建索引,匯入後並行建立
INDEXFILE=idx.sql \ -- 導出索引 DDL 供後續執行
IGNORE=Y \ -- 忽略建表錯誤 (表已存在)
CONSTRAINTS=N \ -- 暫停約束,資料載入後啟用
GRANTS=Y \
ROWS=Y \
FEEDBACK=10000 \ -- 每 1萬行顯示進度
LOG=imp.log
索引與約束後續建立策略
- 資料全量導入完成。
- 執行
idx.sql 建立索引,並行度設為 CPU 核心數:ALTER SESSION ENABLE PARALLEL DDL; ALTER INDEX ... PARALLEL 8;
- 建立約束順序:
CHECK → PK/UK → FK,狀態 ENABLE NOVALIDATE (秒級),業務驗證後改 ENABLE VALIDATE。
- 移除索引 PARALLEL 屬性:
ALTER INDEX ... NOPARALLEL;
- 匯入統計資訊:
DBMS_STATS.IMPORT_SCHEMA_STATS,避免重新收集。
驗收指標
- 匯入耗時 < 目標窗口 (如 4 小時)。
V$SESSION_WAIT 無顯著 log file switch、free buffer waits。
- 匯入後物件計數、行數、Checksum 與來源一致。
現代替代:Data Pump (impdp)
- 並行度原生支援:
PARALLEL=8
- 網路模式無需轉存 DMP 檔:
NETWORK_LINK=src_db
- 可過濾、轉換、重映射表空間/使用者。
- 10g+ 標配,強烈建議取代 IMP/EXP。