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

深入理解 DB2 欄位群組統計資訊:原理、收集與優化器應用實戰

     編輯:DB2 教學

為什麼需要欄位群組統計資訊?

DB2 優化器估算基數時,預設假設謂詞之間獨立。當多個區域等值謂詞(Local Equality Predicates)或等值聯結謂詞存在統計相關性時,獨立假設會導致基數嚴重低估,進而選擇次優存取計劃(如錯誤選擇索引掃描而非表掃描、錯誤聯結順序)。欄位群組統計資訊記錄多欄位組合的不同值群組數,讓優化器能精準偵測相關性。

優化器使用的多欄統計類型

類型來源適用條件統計項目
索引 Keycard 統計索引自動維護索引鍵值完整符合謂詞欄位(順序相符)FIRST2KEYCARD、FIRST3KEYCARD、FIRST4KEYCARD、FULLKEYCARD
欄位群組統計RUNSTATS 手動收集任意欄位組合,無需索引COLGROUPCARD(群組基數)

DB2 V8.2 擴展重點

  • 不再要求索引「完全限定」即可使用 Keycard 統計。
  • 可同時利用索引 Keycard 與使用者收集的欄位群組統計。
  • 聯結謂詞相關性偵測:僅在同一對表的多個等值聯結謂詞間生效,需識別「父表」才能套用該表的多欄統計。

區域等值謂詞相關性偵測範例

情境:SHOW_LISTINGS 表

欄位:SHOW_ID, CHANNEL_ID, STATION_ID, CITY_ID, DAY, TIME

查詢謂詞:

P1: SHOW_ID = ?
P2: CHANNEL_ID = ?
P3: STATION_ID = ?
P4: TIME = ?

可用的索引 Keycard

  • IX1 (SHOW_ID, CHANNEL_ID, STATION_ID, TIME) → 使用 FIRST4KEYCARD / FULLKEYCARD
  • IX2 (SHOW_ID, CHANNEL_ID, STATION_ID, TIME, CITY_ID) → 使用 FIRST4KEYCARD
  • 不可用:IX4 (CITY_ID, SHOW_ID, ...) → Keycard 皆含 CITY_ID,但查詢無此謂詞。

無索引時收集欄位群組統計

RUNSTATS ON TABLE schema.SHOW_LISTINGS
ON COLUMNS ((SHOW_ID, CHANNEL_ID, STATION_ID, TIME))
WITH DISTRIBUTION;

優化器將以相同方式使用此群組基數偵測四個謂詞的相關性。

等值聯結謂詞相關性偵測與父表判定

規則

  1. 優化器嘗試偵測同一對表的多個等值聯結謂詞相關性。
  2. 需識別「父表」:在聯結欄位上擁有較多不同值(COLCARD 較大)且值域涵蓋子表(HIGH2KEY/LOW2KEY 涵蓋關係)的表。
  3. 僅需在父表收集欄位群組統計。
  4. 若無明確父表(中性聯結),V8 FP14/DB2 9 允許在任一表收集;DPF 環境建議兩表皆收集。

父表判定邏輯(簡化)

對謂詞 T1.C = T2.C:

  • 若 COLCARD(T1.C) > COLCARD(T2.C) 且 HIGH2KEY(T1.C) >= HIGH2KEY(T2.C) 且 LOW2KEY(T1.C) <= LOW2KEY(T2.C) → T1 為父表。
  • 若 COLCARD 相等且值域相同 → 中性聯結。
  • 若各謂詞父表不一致 → 無整體父表,優化器不偵測相關性(DPF 環境例外)。

收集欄位群組統計:RUNSTATS 語法與範例

基本語法(DB2 V8.2 / 9)

RUNSTATS ON TABLE schema.table
ON COLUMNS ((col1, col2, col3), (col4, col5), col6)
[AND INDEXES ALL] [WITH DISTRIBUTION] [ALLOW READ/WRITE ACCESS];

常見收集模式

需求指令範例
單一欄位群組ON COLUMNS ((A, B, C))
多個欄位群組 + 單欄ON COLUMNS ((A, B), (A, B, C), D)
所有單欄 + 指定群組ON ALL COLUMNS AND ON COLUMNS ((A, B, C))
搭配索引統計ON ALL COLUMNS AND ON COLUMNS ((A, B)) AND INDEXES ALL

注意事項

  • 群組內欄位順序不影響基數值,但建議依查詢謂詞常見順序排列。
  • 收集群組統計時,群組內每個欄位的單欄統計會一併收集。
  • AUTO_RUNSTATS=ON 會覆蓋手工群組統計,需使用統計資訊設定檔保留。
  • 目前不支援對欄位群組收集分布統計,優化器假設群組內資料均勻分布。

查看現有多欄統計資訊

方法一:db2look -m

db2look -d sample -e -a -m -t ORG -o org.ddl

輸出包含 UPDATE SYSSTAT.COLGROUPS SET colgroupcard = ... 陳述式。

方法二:直接查詢目錄表

-- 欄位群組統計
WITH TMP(ID, NUM) AS (
  SELECT COLGROUPID, MAX(ORDINAL) FROM SYSCAT.COLGROUPCOLS GROUP BY COLGROUPID
),
TMP2(ID, NAME, NUM, TNAME, TSCHEMA) AS (
  SELECT ID, CAST(RTRIM(COLNAME) AS CHAR(128)), NUM, TABNAME, TABSCHEMA
  FROM TMP Y, SYSCAT.COLGROUPCOLS X
  WHERE X.COLGROUPID = Y.ID AND Y.NUM = X.ORDINAL
  UNION ALL
  SELECT Y.ID, CAST(RTRIM(X.COLNAME) || ',' || Y.NAME AS CHAR(128)), Y.NUM-1, TNAME, TSCHEMA
  FROM TMP2 Y, SYSCAT.COLGROUPCOLS X
  WHERE Y.ID = X.COLGROUPID AND X.ORDINAL = Y.NUM-1 AND Y.NUM > 1
    AND TNAME = TABNAME AND TSCHEMA = TABSCHEMA
)
SELECT SUBSTR(TSCHEMA,1,10) TABSCHEMA, SUBSTR(TNAME,1,10) TABNAME,
       NAME COLS, COLGROUPCARD
FROM TMP2, SYSSTAT.COLGROUPS
WHERE ID = COLGROUPID AND NUM = 1
ORDER BY TABSCHEMA, TABNAME;

索引 Keycard 查詢

SELECT SUBSTR(COLNAMES,1,30) COLS, FIRST2KEYCARD, FIRST3KEYCARD, FIRST4KEYCARD, FULLKEYCARD
FROM SYSSTAT.INDEXES
WHERE TABSCHEMA='<綱要>' AND TABNAME='<表名>';

自動統計分析輔助識別需收集群組

  • 啟用 AUTO_STATS_PROF(自動統計資訊分析),DB2 依工作負載推薦雙欄位群組統計。
  • 僅在串列模式啟動,DPF、聯邦查詢、分區內並行環境不支援。
  • 適合測試環境探索潛在相關性,生產環境仍需人工驗證。

實戰演練建議

  1. 建立索引 IXEMP_1 ON EMPLOYEE(JOB, WORKDEPT, SEX),收集索引統計,觀察基數估算是否修正。
  2. 刪除索引,改收集同欄位群組統計,比較優化器行為。
  3. 嘗試不同欄位順序的索引/群組,理解「完全限定」與「前綴匹配」對 Keycard 使用的影響。

總結

  • 欄位群組統計是解決多謂詞相關性導致基數誤估的關鍵工具,無需建立索引即可生效。
  • 聯結場景務必先判定父表,僅在父表收集群組統計即可(中性聯結除外)。
  • 善用 db2look -m 或目錄查詢驗證統計是否正確寫入。
  • 配合統計資訊設定檔防止自動收集覆蓋關鍵群組統計。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved