DB2 的「宣告式全域暫存表」是開發高效能、低鎖爭用臨時資料處理邏輯的利器。但許多開發者初次使用時踩坑:忘建使用者暫存表空間、不清楚 Commit 行為、誤以為可跨 Session 共用。本文彙整六大核心特性、建表前置作業、參數控制技巧,並附上可直接套用的標準建表範本。
DB2 建立資料庫時預設不建立使用者暫存表空間。若未預先建立,`DECLARE GLOBAL TEMPORARY TABLE` 會直接報錯
SQL1584N。
CREATE USER TEMPORARY TABLESPACE USERTMP1
MANAGED BY AUTOMATIC STORAGE
USING STOGROUP IBMSTOGROUP;
-- 或指定容器路徑(DMS)
-- MANAGED BY DATABASE USING (FILE '/db2data/usertmp1' 100M);
建議預留足夠空間並啟用自動擴展,避免大量臨時資料寫入導致表空間滿載。
| # | 特性 | 說明與實務含意 |
|---|---|---|
| 1 | 建表語法固定 | 必須使用 DECLARE GLOBAL TEMPORARY TABLE,且 ON COMMIT PRESERVE ROWS / DELETE ROWS 由參數控制。 |
| 2 | Schema 固定為 SESSION | 所有 DGTT 隸屬 SESSION schema,不同 Session 同名表互不干擾,完全隔離。 |
| 3 | 預設 ON COMMIT DELETE ROWS | 執行 COMMIT 時自動清空表內資料(保留結構)。需保留資料跨交易時,建表須指定 ON COMMIT PRESERVE ROWS。 |
| 4 | ROLLBACK 會刪除表定義 | 執行 ROLLBACK 會直接 Drop 整張暫存表(含結構與資料),下一條 SQL 再用該表會報錯。交易設計時須注意。 |
| 5 | V8 起支援 LOGGED / NOT LOGGED | 建表可指定 LOGGED(預設,支援回滾、影響 Redo Log 量)或 NOT LOGGED(高效能、大量載入、不支援 ROLLBACK 回滾資料)。視業務一致性需求選擇。 |
| 6 | 生命週期 = Session/Connection | 連線斷開或應用結束,表自動消失;無法跨連線、跨應用共享。 |
DECLARE GLOBAL TEMPORARY TABLE SESSION.TMP_ORDER_SUMMARY
(
ORDER_ID BIGINT NOT NULL,
CUST_ID INTEGER,
ORDER_DATE DATE,
TOTAL_AMT DECIMAL(15,2),
STATUS CHAR(1)
)
IN USERTMP1 -- 指定使用者暫存表空間
ON COMMIT PRESERVE ROWS -- Commit 保留資料;若要自動清空改 DELETE ROWS
NOT LOGGED -- 大量中介資料、不需回滾時用 NOT LOGGED 提升效能
WITH REPLACE; -- 同 Session 重複宣告時自動替換,避免報錯
-- 在 SQL PL / Stored Procedure 中動態建表
BEGIN ATOMIC
EXECUTE IMMEDIATE '
DECLARE GLOBAL TEMPORARY TABLE SESSION.TMP_' || V_BATCH_ID || '
(COL1 INT, COL2 VARCHAR(50))
IN USERTMP1 ON COMMIT PRESERVE ROWS NOT LOGGED WITH REPLACE';
END;
搭配 `WITH REPLACE`,同一 Session 內多次呼叫同名暫存表不會報錯,極適合批次作業迴圈處理。
一句話總結:DGTT = Session 隔離 + 結構持久/資料可控 + 零鎖爭用 + 自動清理。用好前置表空間、Commit/Log 參數、Rollback 行為,它就是批次中介、複雜報表、ETL 暫存的最佳拍檔。