遷移 80MB+ 大表跨表空間或跨用戶,傳統 DROP/CREATE/INSERT 或 EXP/IMP 耗時過長。Oracle 8i+ 提供兩大「繞過緩衝區、繞過 Redo、直寫資料檔」的高速通道:CREATE TABLE ... AS SELECT (CTAS) NOLOGGING 與 INSERT /*+ APPEND */。本文詳細對比兩者語法、鎖行為、適用場景、索引/約束處理與最佳實務。
CREATE TABLE target_tablename
TABLESPACE target_tablespace_name
NOLOGGING
PCTFREE 10 PCTUSED 60
STORAGE (INITIAL 5M NEXT 5M MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0)
AS SELECT * FROM source_user.source_tablename WHERE condition;
PARALLEL n 多進程掃描/寫入| 物件類型 | 是否繼承 | 處理方式 |
|---|---|---|
| NOT NULL 約束 | ✅ 是 | 自動保留 |
| Primary Key / Unique / FK / Check | ❌ 否 | 遷移後 ALTER TABLE ADD CONSTRAINT |
| Indexes | ❌ 否 | 遷移後 CREATE INDEX (可 NOLOGGING PARALLEL) |
| Default Values | ❌ 否 | 遷移後 ALTER TABLE MODIFY DEFAULT |
| Triggers | ❌ 否 | 遷移後重建 |
| Grants/Privileges | ❌ 否 | 遷移後重新授權 |
INSERT /*+ APPEND */ INTO target_tablename
SELECT * FROM source_user.source_tablename WHERE condition;
COMMIT;
ALTER TABLE ... NOLOGGING 達到最小 Redo| 維度 | CTAS NOLOGGING | INSERT APPEND |
|---|---|---|
| 目標表是否預存在 | 否 (建立新表) | 是 |
| 索引/約束處理 | 全手動重建 | 保留現有,僅資料追加 |
| 鎖影響 | 無 (新表無其他存取) | 獨佔表鎖,阻塞 DML |
| 適用場景 | 全量遷移、建立歷史表、資料搬遷 | 增量追加、ETL 階層載入、分區維護 |
| 並行度控制 | PARALLEL n 子句 | ALTER SESSION ENABLE PARALLEL DML + Hint |
| 統計資訊 | 建立後需 DBMS_STATS | 載入後需 DBMS_STATS |
CREATE TABLE new_schema.target_table
TABLESPACE new_tbs NOLOGGING PARALLEL 8
AS SELECT * FROM old_schema.source_table;
CREATE INDEX idx_col ON new_schema.target_table(col) TABLESPACE idx_tbs NOLOGGING PARALLEL 8;
ALTER TABLE EXCHANGE PARTITION 秒級切換CTAS NOLOGGING 與 INSERT APPEND 是 Oracle 大量資料移動的雙引擎。選型鐵律:全量新建用 CTAS,增量追加用 APPEND,OLTP 核心表嚴禁 APPEND 直衝。記住三個「繞過」:繞過 SGA、繞過 Redo、繞過 Rollback,才是速度來源。遷移不僅是資料搬運,更是索引、約束、授權、統計、同義詞的系統工程。建立標準化遷移腳本模板、驗證清單、回滾預案,方能在維護窗口從容完成 TB 級大表搬遷。