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

理解 DB2 中的列組統計信息:原理、收集與優化效用

     編輯:DB2 教學

列組統計信息 (Column Group Statistics) 概覽

DB2 優化器依賴統計信息估算查詢基數 (Cardinality)。單列統計 (均值、頻率、直方圖) 無法捕捉列間相關性 (如城市-省份、品牌-類別、年-月)。列組統計 (Column Group Statistics, 又稱多列統計/聯合統計) 通過記錄多列值組合的分佈,顯著提升多列謂詞、連接、分組查詢的基數估算準確度,從而生成更優訪問計劃。

為什麼需要列組統計?

假設表 `customers(city, province)`,單列統計顯示 `city='Shanghai'` 選擇率 1%,`province='Shanghai'` 選擇率 1%。優化器假設獨立,估算聯合選擇率 0.01% (1/10000)。實際上上海市即上海省,真實選擇率 1%。誤差 100 倍導致優化器選擇嵌套循環連接而非哈希連接、錯誤判斷索引掃描代價。列組統計直接記錄 `(city, province)` 組合頻率,消除獨立性假設偏差。

創建與收集列組統計

語法 (RUNSTATS)

RUNSTATS ON TABLE schema.customers
  ON ALL COLUMNS
  AND COLUMNS ((city, province))  -- 列組,括號括起
  AND INDEXES ALL
  ALLOW WRITE ACCESS;
  • 可指定多個列組:`AND COLUMNS ((c1, c2), (c3, c4, c5))`。
  • 列組順序無關 (內部排序),但建議按查詢謂詞順序 (等值連接列在前)。
  • 與單列統計、索引統計可同時收集。

系統目錄表

  • `SYSCAT.COLGROUPS`:記錄列組定義 (GROUPENAME, COLNAMES, COLNOs)。
  • `SYSCAT.COLDIST`:存儲列組分佈統計 (TYPE='G' 表示列組),包含 `COLVALUE` (組合值)、`VALCOUNT` (頻率)、`DISTCOUNT` (直方圖桶)。

優化器使用場景

設計與維護最佳實踐

  1. 識別高價值列組:分析工作負載 (包緩存 `MON_GET_PKG_CACHE_STMT`、查詢審計)、找出頻繁共同出現在 WHERE/JOIN/GROUP BY 中的列組合 (2-4 列最佳,>5 列統計開銷大、直方圖稀疏)。
  2. 避免冗餘:若已有複合索引 `(a,b,c)`,優化器已利用索引統計 (FIRSTKEYCARD, FULLKEYCARD) 隱含列組信息,額外創建列組 `(a,b,c)` 邊際收益低。但 `(a,b)` 可能仍有價值 (前綴列)。
  3. 收集頻率與采樣:高變更率表每日/每周 `RUNSTATS ... TABLESAMPLE SYSTEM (10)` (采樣) + 列組;低變更率每月全掃描。列組統計對采樣敏感度較高,建議全掃描或大采樣率。
  4. 統計信息版本管理:重大統計變更前備份 `db2look -t schema.table -stats`,回滾時恢復。
  5. 監控統計健康度:`RUNSTATS` 後對比 `SYSCAT.COLDIST` 列組行數與表行數比例、桶分佈均勻度;異常觸發重收集。

進階:統計信息反饋與自動調優

  • DB2 10.5+ 引入 `STATISTICS FEEDBACK`:執行時發現基數估算誤差大,自動記錄反饋,下次 `RUNSTATS` 自動建議/創建列組。
  • 自動維護窗口 (`AUTO_MAINT`, `AUTO_RUNSTATS`) 可配置 `AUTO_STATS_COLGROUPS ON` 自動發現並收集高價值列組 (需工作負載代表性)。

常見誤區

  • 「所有列組合都建列組」→ 統計收集時間激增、目錄表膨脹、優化器編譯時間增加。只建業務關鍵列組。
  • 「列組替代複合索引」→ 列組僅供優化器估算,**不提供訪問路徑**。需訪問路徑仍須創建索引。
  • 「收集後永久有效」→ 數據分佈漂移 (新城市、新產品) 會導致列組統計失效,需定期刷新。

總結

DB2 列組統計信息是解決多列相關性導致基數估算偏差的利器。通過工作負載驅動識別關鍵列組、合理收集維護、配合自動統計反饋,可顯著提升複雜查詢穩定性與性能,是高級 DBA 必備調優技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
查詢模式列組幫助示例
多列等值謂詞直接查找組合頻率,避免獨立性假設WHERE city=? AND province=?
多列連接估算連接基數,選擇最優連接方法/順序JOIN ON t1.city=t2.city AND t1.province=t2.province
GROUP BY 多列估算分組數,決定哈希/排序分組、內存分配GROUP BY city, province
複合索引匹配輔助優化器判斷索引選擇性 (索引鍵列即天然列組)INDEX (city, province) + WHERE city=? AND province=?
星型模式維度連接事實表外鍵列組 (dim1_key, dim2_key) 提升連接基數估算FACT JOIN DIM1, DIM2 ON ...