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

DB2 實用進階技巧十則:生成欄、Identity、分頁查詢、臨時表與視圖策略

     編輯:DB2 教學

突破關係純粹性的實用妥協

關係模型雖美,但實務上常需妥協以換取效能或開發效率。本文匯總十大 DB2 實用技巧,涵蓋生成欄、人造鍵、分頁、大量刪除、結構變更、視圖與 MQT 選擇、宣告式暫存表 (DGTT) vs 共用表運算式 (CTE) 等核心主題。

1. 儲存衍生值:生成欄

DB2 V7 引入 GENERATED ALWAYS AS,自動維護衍生欄值,適用場景:

  • 前端工具無法自訂計算邏輯(如 SELECT * 只能看到欄位),生成欄提供現成結果(如 COMPENSATION = SALARY + COMMISSION)。
  • 需對計算結果建立索引(如不區分大小寫搜尋:NAME_UPPER GENERATED ALWAYS AS (UPPER(NAME)) + 索引)。
  • 作為人造主鍵來源(見下節)。

2. 產生唯一行識別碼:三大方案

方案特性適用場景
IDENTITY 欄
GENERATED BY DEFAULT AS IDENTITY
表級唯一,可快取 (CACHE),崩潰可能留間隙;IDENTITY_VAL_LOCAL() 取回剛插入值單表自增鍵,單分區或非 EEE 環境
SEQUENCE 物件
(V7 FP3+)
資料庫級唯一,跨表共用,支援 CYCLE 循環重用多表共用鍵值、需循環號碼
GENERATE_UNIQUE()節點號 + 時間戳,CHAR(13) FOR BIT DATA,EEE 相容多重分區 (EEE) 環境、需全域唯一但不要求序數

簡易替代方案:COALESCE((SELECT MAX(key_col) FROM t),0)+1(僅適合極低併發)。

3. 擷取結果集子集:分頁查詢

-- 前 10 筆
SELECT NAME FROM ADDRESS ORDER BY NAME FETCH FIRST 10 ROWS ONLY;

-- 不需排序,只要任意 10 筆(省排序成本)
SELECT NAME FROM ADDRESS FETCH FIRST 10 ROWS ONLY;

ORDER BY 強制全結果集排序(記憶體壓力大),僅需「任意 N 筆」時請省略。

4. 即時為結果集編號

關係理論無行序,但前端常需行號。可用 ROW_NUMBER() OVER() (V8+) 或舊版技巧(標量子查詢計數)實現,犧牲效能換易用性。

5. 大量刪除不記錄日誌

ALTER TABLE ... ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE 或 TRUNCATE TABLE (V9.7+),瞬間釋放空間、極少日誌。

6. 「刪除」欄位:視圖 + RENAME 閃避法

  1. 建立排除該欄位的視圖。
  2. RENAME TABLE t TO t_old; CREATE VIEW t AS SELECT ... FROM t_old;
  3. 應用程式改存取視圖,底層表結構未動,避免鎖升級與應用改代碼。

7. 擴寬 VARCHAR 欄位

直接 ALTER TABLE ... ALTER COLUMN ... SET DATA TYPE VARCHAR(n) (V8+),無需重建表,元資料操作秒級完成。

8. 視圖 vs 物化查詢表 (MQT/匯總表)

  • 視圖:即時計算、資料永遠最新、零儲存成本、查詢時才付出 CPU。
  • MQT:預先計算儲存、查詢極快、需 REFRESH TABLE 維護、佔空間、資料有延遲。
  • 決策:高頻、大量、可容忍秒~分級延遲的彙總查詢用 MQT;其餘用視圖。

9. DGTT vs CTE:臨時資料集選擇指南

特性DGTT (DECLARE GLOBAL TEMPORARY TABLE)CTE (WITH ...)
生命週期Session 級,提交/斷線可保留 (ON COMMIT PRESERVE ROWS)單一陳述式內
可重用性同 Session 多次引用僅當下查詢
索引/統計可建立索引、RUNSTATS不可
適用場景複雜多步驟 ETL、中間結果重用、需索引加速單一查詢簡化、遞迴查詢、衍生表替代

簡單原則:跨語句重用、需索引、大量中間資料 → DGTT;單一語句邏輯拆解 → CTE。

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