關係模型雖美,但實務上常需妥協以換取效能或開發效率。本文匯總十大 DB2 實用技巧,涵蓋生成欄、人造鍵、分頁、大量刪除、結構變更、視圖與 MQT 選擇、宣告式暫存表 (DGTT) vs 共用表運算式 (CTE) 等核心主題。
DB2 V7 引入 GENERATED ALWAYS AS,自動維護衍生欄值,適用場景:
SELECT * 只能看到欄位),生成欄提供現成結果(如 COMPENSATION = SALARY + COMMISSION)。NAME_UPPER GENERATED ALWAYS AS (UPPER(NAME)) + 索引)。| 方案 | 特性 | 適用場景 |
|---|---|---|
IDENTITY 欄GENERATED BY DEFAULT AS IDENTITY | 表級唯一,可快取 (CACHE),崩潰可能留間隙;IDENTITY_VAL_LOCAL() 取回剛插入值 | 單表自增鍵,單分區或非 EEE 環境 |
| SEQUENCE 物件 (V7 FP3+) | 資料庫級唯一,跨表共用,支援 CYCLE 循環重用 | 多表共用鍵值、需循環號碼 |
| GENERATE_UNIQUE() | 節點號 + 時間戳,CHAR(13) FOR BIT DATA,EEE 相容 | 多重分區 (EEE) 環境、需全域唯一但不要求序數 |
簡易替代方案:COALESCE((SELECT MAX(key_col) FROM t),0)+1(僅適合極低併發)。
-- 前 10 筆
SELECT NAME FROM ADDRESS ORDER BY NAME FETCH FIRST 10 ROWS ONLY;
-- 不需排序,只要任意 10 筆(省排序成本)
SELECT NAME FROM ADDRESS FETCH FIRST 10 ROWS ONLY;
ORDER BY 強制全結果集排序(記憶體壓力大),僅需「任意 N 筆」時請省略。
關係理論無行序,但前端常需行號。可用 ROW_NUMBER() OVER() (V8+) 或舊版技巧(標量子查詢計數)實現,犧牲效能換易用性。
ALTER TABLE ... ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE 或 TRUNCATE TABLE (V9.7+),瞬間釋放空間、極少日誌。
RENAME TABLE t TO t_old; CREATE VIEW t AS SELECT ... FROM t_old;直接 ALTER TABLE ... ALTER COLUMN ... SET DATA TYPE VARCHAR(n) (V8+),無需重建表,元資料操作秒級完成。
REFRESH TABLE 維護、佔空間、資料有延遲。| 特性 | DGTT (DECLARE GLOBAL TEMPORARY TABLE) | CTE (WITH ...) |
|---|---|---|
| 生命週期 | Session 級,提交/斷線可保留 (ON COMMIT PRESERVE ROWS) | 單一陳述式內 |
| 可重用性 | 同 Session 多次引用 | 僅當下查詢 |
| 索引/統計 | 可建立索引、RUNSTATS | 不可 |
| 適用場景 | 複雜多步驟 ETL、中間結果重用、需索引加速 | 單一查詢簡化、遞迴查詢、衍生表替代 |
簡單原則:跨語句重用、需索引、大量中間資料 → DGTT;單一語句邏輯拆解 → CTE。