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

DB2 宣告暫存表(DGTT)六大必知陷阱與應對策略

     編輯:DB2 教學

宣告暫存表(DGTT)核心機制

DB2 的「宣告全域暫存表」(Declared Global Temporary Table, DGTT)與永久表截然不同:定義於 SESSION 模式、資料對會話私有、會話結束自動消失。正確使用能大幅簡化複雜 ETL 與報表邏輯,但六大特性若不了解極易踩坑。

六大關鍵注意事項

1. 必須建立於使用者暫存表空間

語法:DECLARE GLOBAL TEMPORARY TABLE session.t1 (c1 INT) IN USERTEMPSPACE。若無 USER TEMPORARY TABLESPACE,建立會失敗(SQL1584N)。

2. 資料庫建立時不預設建立使用者暫存表空間

需 DBA 事先執行:
CREATE USER TEMPORARY TABLESPACE usertemp MANAGED BY DATABASE USING (FILE '/db2fs/usertemp' 10000)。這是新環境部署的標準檢查清單項目。

3. 結構描述固定為 SESSION

引用時必須加前綴:SESSION.t1 或設定 SET CURRENT SCHEMA = SESSION。若省略,DB2 會去找同名永久表導致錯誤或資料混淆。

4. COMMIT 預設清空資料,可透過選項控制

  • ON COMMIT DELETE ROWS(預設):提交交易時截斷表資料,結構保留。
  • ON COMMIT PRESERVE ROWS:提交後資料保留,直到會話結束或明確 DELETE/TRUNCATE。

報表多步驟交易建議用 PRESERVE ROWS,避免中間結果丟失。

5. ROLLBACK 會直接刪除暫存表定義

此行為與永久表截然不同:ROLLBACK 不僅回滾資料,連表定義一併移除。後續同會話再引用該表會報「表不存在」。應用程式錯誤處理邏輯務必重新 DECLARE。

6. DB2 V8 起支援暫存表日誌記錄

建立時指定 LOGGED(預設)或 NOT LOGGED:

  • LOGGED:操作寫入交易日誌,支援 ROLLBACK、崩潰復原,但產生日誌量、影響效能。
  • NOT LOGGED:不寫日誌,載入大量資料極快,但交易中 ROLLBACK 或崩潰會導致表資料損壞,需重新載入。

ETL 階段性暫存表建議 NOT LOGGED,關鍵業務中間結果用 LOGGED。

實戰檢查清單

檢查點驗證指令
使用者暫存表空間是否存在SELECT TBSPACE FROM SYSCAT.TABLESPACES WHERE TBSPACETYPE = 'U'
會話中現有 DGTT 清單SELECT TABNAME FROM SESSION.TABLES
暫存表日誌屬性SELECT LOGGED FROM SESSION.TABLES WHERE TABNAME = 'T1'

深入理解六大特性,將 DGTT 從「地雷區」轉為「加速器」。

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