數據裝載前建索引:索引隨數據同步維護,需較大日誌空間,裝載速度較慢,可搭配 NOT LOGGED INITIALLY 減少日誌開銷。
數據裝載後建索引:裝載速度最快,但必須立即執行 RUNSTATS ON TABLE ... AND INDEXES ALL 更新統計信息,否則優化器無法選擇索引訪問路徑。
單節點表空間(如 DIM 維表空間)僅利用 2 CPU/4GB 記憶體。將事實表按業務鍵分區至 32 節點表空間,查詢時 32 節點並行掃描、結果匯總至協調節點,吞吐量成倍提升。前提:必須建立合適分區鍵與局部索引。
ALTER TABLE ... ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE 可使 INSERT/UPDATE/DELETE 極少產生日誌,避免日誌爭用。風險:操作失敗無法回滾,僅能截斷重建表。 僅適用於可重跑的 ETL 階段性表。
LOCKSIZE TABLE 可將行鎖升級為表鎖,大幅減少鎖結構佔用的記憶體與鎖升級開銷。適用於獨佔批量裝載、全表掃描報表查詢等低並發場景。
ETL 中臨時表常因「預留欄位」或「全量複製」導致體積膨脹。建立臨時表時:
ON 子句僅放關聯條件 + 右表過濾條件;主表過濾條件下推至 WHERE 子句。錯誤寫法會導致優化器誤判連接順序,產生笛卡爾積或錯誤結果集。
| 優化點 | 適用場景 | 風險提示 |
|---|---|---|
| 裝載後建索引+RUNSTATS | 大批量初始裝載 | 忘記 RUNSTATS 導致全表掃描 |
| 多節點表空間+分區鍵 | 事實表、大歷史表 | 分區鍵選擇不當導致數據傾斜 |
| NOT LOGGED 模式 | 可重跑暫存表 | 失敗需人工介入重建 |
| 表級鎖 | 獨佔批量作業 | 高並發場景嚴重阻塞 |
| 瘦身臨時表 | 多階段 ETL | 欄位缺失導致下游報錯 |
| LEFT JOIN 條件分離 | 複雜報表查詢 | 語義錯誤產生錯誤結果 |