DB2 的「宣告全域暫存表」(Declared Global Temporary Table, DGTT)與永久表截然不同:定義於 SESSION 模式、資料對會話私有、會話結束自動消失。正確使用能大幅簡化複雜 ETL 與報表邏輯,但六大特性若不了解極易踩坑。
語法:DECLARE GLOBAL TEMPORARY TABLE session.t1 (c1 INT) IN USERTEMPSPACE。若無 USER TEMPORARY TABLESPACE,建立會失敗(SQL1584N)。
需 DBA 事先執行:CREATE USER TEMPORARY TABLESPACE usertemp MANAGED BY DATABASE USING (FILE '/db2fs/usertemp' 10000)。這是新環境部署的標準檢查清單項目。
引用時必須加前綴:SESSION.t1 或設定 SET CURRENT SCHEMA = SESSION。若省略,DB2 會去找同名永久表導致錯誤或資料混淆。
ON COMMIT DELETE ROWS(預設):提交交易時截斷表資料,結構保留。ON COMMIT PRESERVE ROWS:提交後資料保留,直到會話結束或明確 DELETE/TRUNCATE。報表多步驟交易建議用 PRESERVE ROWS,避免中間結果丟失。
此行為與永久表截然不同:ROLLBACK 不僅回滾資料,連表定義一併移除。後續同會話再引用該表會報「表不存在」。應用程式錯誤處理邏輯務必重新 DECLARE。
建立時指定 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 從「地雷區」轉為「加速器」。