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

DB2 全域暫存表(DGTT)使用必知的 6 大關鍵特性

     編輯:DB2 教學

DECLARE GLOBAL TEMPORARY TABLE 實戰避坑指南

DB2 的**宣告式全域暫存表(DGTT)**與 Oracle/Sybase 的暫存表機制差異極大。不瞭解其生命週期、Schema 隔離與提交行為,極易在生產環境踩坑。以下 6 大特性是開發與 DBA 必須掌握的核心知識。

1. 必須建立在「使用者暫存表空間」上

  • DB2 建庫預設**不建立**使用者暫存表空間(USER TEMPORARY TABLESPACE)
  • 使用 DGTT 前,DBA 必須先手動建立:
    create user temporary tablespace usrtemp pagesize 8k managed by automatic storage;
  • 系統暫存表空間(SYSTEM TEMPORARY)無法支援 DGTT

2. Schema 固定為 SESSION

  • 所有 DGTT 隸屬 SESSION schema,不受 CURRENT SCHEMA 影響
  • 引用時可省略 schema:SELECT * FROM temp_tab 等同 SELECT * FROM SESSION.temp_tab

3. 預設 ON COMMIT PRESERVE ROWS?實則為 DELETE ROWS

  • **預設行為**:`COMMIT` 時**刪除所有資料列**(保留定義)
  • 可透過建表選項控制:
    • `ON COMMIT PRESERVE ROWS`:Commit 保留資料
    • `ON COMMIT DELETE ROWS`:Commit 清空資料(預設)

4. ROLLBACK 會「刪除表定義」而非只是回滾資料

  • 執行 `ROLLBACK` 會導致該 Session 內的 DGTT **定義連同資料一起消失**
  • 後續同 Session 參考該表會報錯(SQL0204N),需重新 DECLARE

5. 多執行緒環境極難控制

  • DGTT 生命週期綁定 **Session(連線)**,而非 Transaction
  • 連線池、多執行緒共用連線時,DGTT 狀態極難預測,建議**避免在連線池應用中使用**

6. V8+ 支援 LOGGED 選項(可記錄重做日誌)

declare global temporary table session.temp_logged (id int) logged;
  • 預設 `NOT LOGGED`:操作不寫重做日誌,效能佳但不可復原
  • `LOGGED`:支援 Rollback 到 Savepoint,代價是日誌開銷

建表最佳實踐範本

declare global temporary table session.my_temp (
  id int,
  name varchar(50)
)
with replace          -- 若同名表存在則替換,避免報錯
on commit preserve rows  -- 視業務決定保留/刪除
not logged;           -- 或 logged

DGTT 生命週期示意圖

掌握這 6 大特性,DGTT 才能真正成為複雜邏輯暫存中間結果的利器,而非生產事故溫床。

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