CREATE TABLE vincent_sms AS SELECT * FROM vincent_voice;
CREATE TABLE vincent_sms
TABLESPACE users_data -- 指定表空間
PCTFREE 20
STORAGE (INITIAL 10M NEXT 10M)
AS SELECT * FROM vincent_voice WHERE create_date > SYSDATE - 30;
INSERT INTO vincent_sms SELECT * FROM vincent_voice;
| 維度 | CTAS (CREATE TABLE AS SELECT) | INSERT SELECT |
|---|---|---|
| 目標表 | **不存在**,自動建立 | **必須已存在** |
| 結構來源 | SELECT 查詢結果元資料 | 既有表定義 |
| 約束複製 | ❌ 不複製 | ✅ 目標表既有約束生效 |
| 索引複製 | ❌ 不複製 | ❌ 不相關 |
| 執行速度 | 極快 (直接路徑載入,無 Redo 選項) | 較慢 (產生 Redo/Undo、觸發器、約束檢查) |
| 並行化 | ✅ `PARALLEL` 子句原生支援 | ✅ `/*+ APPEND PARALLEL */` Hint |
| 回滾段壓力 | 極小 (可 `NOLOGGING`) | 大 (完整 Redo/Undo) |
| 適用資料量 | 大量初始載入 | 增量/中等量追加 |
-- 1. 並行建立
CREATE TABLE big_table_new PARALLEL 8
AS SELECT /*+ PARALLEL(s 8) */ * FROM big_table_source s;
-- 2. 無日誌模式 (需資料庫 ARCHIVELOG 模式下謹慎使用)
CREATE TABLE big_table_new NOLOGGING
AS SELECT * FROM big_table_source;
-- 3. 結合壓縮
CREATE TABLE big_table_new COMPRESS FOR QUERY HIGH
AS SELECT * FROM big_table_source;
-- 1. 直接路徑載入 (APPEND) — 繞過緩衝區、直接寫入新區塊、最小化 Redo
INSERT /*+ APPEND */ INTO target_table SELECT * FROM source_table;
-- 2. 並行 DML (需啟用)
ALTER SESSION ENABLE PARALLEL DML;
INSERT /*+ APPEND PARALLEL(t 8) */ INTO target_table t SELECT * FROM source_table;
-- 3. 無日誌 (配合 APPEND)
ALTER TABLE target_table NOLOGGING;
INSERT /*+ APPEND */ INTO target_table SELECT * FROM source_table;
-- 完成後記得 ALTER TABLE target_table LOGGING;
| 陷阱 | 現象 | 解決 |
|---|---|---|
| CTAS 不複製主鍵 | 新表無主鍵,後續 JOIN/更新效能差 | 建表後立即 `ALTER TABLE ... ADD PRIMARY KEY (...)` |
| INSERT SELECT 欄位順序錯位 | 資料寫入錯誤欄位 | **永遠明確列出目標欄位**:`INSERT INTO t (c1,c2) SELECT c2,c1 FROM s` |
| 大量 INSERT 觸發器拖慢 | 逐行觸發 AFTER INSERT 觸發器 | 載入前 `ALTER TRIGGER ... DISABLE`,後 `ENABLE` |
| NOLOGGING 非預期資料遺失 | 載入後備份前資料庫損壞,無法恢復該段資料 | 僅用於可重載資料 (如暫存表、測試環境),生產核心表禁用 |
| PARALLEL 導致資源耗盡 | 並行度過高佔滿 CPU/IO | 並行度 ≤ CPU 核心數,監控 `V$PX_SESSION` |
MERGE INTO target_table t
USING source_table s
ON (t.id = s.id)
WHEN MATCHED THEN
UPDATE SET t.col1 = s.col1, t.col2 = s.col2, t.update_time = SYSDATE
WHEN NOT MATCHED THEN
INSERT (id, col1, col2, create_time) VALUES (s.id, s.col1, s.col2, SYSDATE);
適用於:增量同步、資料倉庫維度表 SCD Type 1 維護。
CTAS 是「建表+導資料」的核武器,INSERT SELECT 是「增量追加」的主力。掌握 PARALLEL、APPEND、NOLOGGING 三大加速鍵,並明確欄位列表、管理觸發器/約束影響,是高效資料操作的核心技能。