| 路徑 | 優點 | 缺點 | 關鍵動作 |
|---|---|---|---|
| 插入資料 前 建索引 | 索引與資料同步更新,統計資料自然準確 | 插入過程維護索引產生海量日誌,速度較慢 | 搭配 ALTER TABLE ... ACTIVATE NOT LOGGED INITIALLY 或 LOAD ... NONRECOVERABLE 降低日誌量 |
| 插入資料 後 建索引 | 大量載入極快,無索引維護開銷 | 統計資料過期,優化器不使用索引 → 全表掃描 | 必須 執行 RUNSTATS ON TABLE schema.tab AND INDEXES ALL 更新統計 |
黃金法則:無論哪種路徑,RUNSTATS 都是讓優化器「看見」索引的前提條件。
PARTITION BY HASH(id)),將大表分散到 32 個節點。即使 32 節點並行,良好的索引設計(叢集索引、覆蓋索引)仍能進一步縮減每節點掃描量,雙重加速。
| 模式 | 日誌量 | 速度 | 可恢復性 | 適用場景 |
|---|---|---|---|---|
| 完全記錄 | 巨大 | 慢 | 完整(支援 ROLLBACK/前滾) | OLTP 核心業務、不可遺失資料 |
NOT LOGGED INITIALLY (NLI) | 極少(僅元數據) | 極快 | 操作失敗 → 表標記不可用,需 DROP 重建 | 資料倉庫初始載入、可重建的暫存表、ETL 階段表 |
LOAD ... NONRECOVERABLE | 無 | 最快 | 不可前滾恢復,需載入後立即備份 | TB 級初始化、大量歷史資料歸檔 |
鐵律:啟用 NLI/NONRECOVERABLE 的表,操作失敗 = 表報廢,只能重建。務必在載入成功後立即執行離線備份。
LOCKLIST(4KB 頁數)與 MAXLOCKS(單應用佔用上限%)共同控制。LOCK TABLE tab IN EXCLUSIVE MODE 或 SHARE MODE 可將數萬行鎖縮減為 1 把表鎖。INSERT INTO temp SELECT * FROM big_table → 臨時表膨脹 10 倍,後續連接/排序極慢。DECLARE GLOBAL TEMPORARY TABLE session.temp_x AS
(SELECT id, name, dept FROM big_table WHERE status='A')
DEFINITION ONLY;
INSERT INTO session.temp_x
SELECT id, name, dept FROM big_table WHERE status='A';
CREATE INDEX session.ix_temp_x_dept ON session.temp_x(dept);
DECLARED GLOBAL TEMPORARY TABLE(DGTT)隔離會話、自動清理。SELECT a.*, b.col
FROM main a
LEFT JOIN sub b
ON a.id = b.id
AND a.status = 'ACTIVE' -- ❌ 主表過濾條件放在 ON 中
WHERE b.type = 'X';
後果:優化器可能將 LEFT JOIN 轉為 INNER JOIN,或產生錯誤結果集,且無法利用主表索引過濾。
SELECT a.*, b.col
FROM main a
LEFT JOIN sub b
ON a.id = b.id -- ✅ 僅連接條件
AND b.type = 'X' -- ✅ 右表過濾條件
WHERE a.status = 'ACTIVE'; -- ✅ 主表過濾條件放在 WHERE
ON 子句僅包含:連接鍵 + 右表(被外連接側)的過濾條件。WHERE 子句。RUNSTATS(插入前/後皆可,但統計必須新)。