首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

DB2 全域暫存表 (DGTT) 實戰筆記:六大必知特性與建表範本

     編輯:DB2 教學

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 由參數控制。
2Schema 固定為 SESSION所有 DGTT 隸屬 SESSION schema,不同 Session 同名表互不干擾,完全隔離。
3預設 ON COMMIT DELETE ROWS執行 COMMIT 時自動清空表內資料(保留結構)。需保留資料跨交易時,建表須指定 ON COMMIT PRESERVE ROWS。
4ROLLBACK 會刪除表定義執行 ROLLBACK 會直接 Drop 整張暫存表(含結構與資料),下一條 SQL 再用該表會報錯。交易設計時須注意。
5V8 起支援 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 重複宣告時自動替換,避免報錯

常見踩坑與對策

  • 報 SQL1584N → 確認已建立使用者暫存表空間,且連線用戶有 `USE` 權限。
  • Commit 後資料不見 → 預設 `DELETE ROWS`,改用 `PRESERVE ROWS`。
  • Rollback 後表消失 → 這是特性非 Bug,調整交易邊界:暫存表操作放在獨立交易或避免 Rollback。
  • 想跨 Procedure/Trigger 共用 → 不可能,改用 建立實體表 + 定時清理 或 MQT/物化查詢表。
  • 大量載入效能不足 → 改 `NOT LOGGED`、調大表空間 Prefetch/Extent Size、考慮 `LOAD` 指令(需 `LOGGED` 表)。

進階技巧:動態建表與應用整合


-- 在 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 暫存的最佳拍檔。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved