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

DB2 優化器中分布統計信息的應用與參數標記影響分析

     編輯:DB2 教學

基本統計 vs 分布統計

RUNSTATS 收集基本統計:表頁面數、行數、溢出行、基數;欄位基數、平均長度、次大/次小值、NULL 數。基本統計假設值均勻分布,無法反映數據傾斜。

分布統計類型

頻率統計

記錄特定值出現次數。例:CARS 表 100 萬行,型號 A 佔 50%、B 佔 30%、C 佔 10%。優化器可精確估算 WHERE TYPE='H' 的過濾因子。

分位數統計

記錄值的分布區間。例:STATE 欄位按升序,定期採樣記錄行數對應值。優化器可估算 WHERE STATE < 100 或 BETWEEN 的過濾因子,20 個量值誤差 <5%。

實戰範例:分布統計如何改善計劃

表 CARS 100 萬行,99.9% 已完工 (STATE=100),型號均勻。查詢:SELECT * FROM CARS WHERE STATE < 100 AND TYPE='A'。

  • 無分布統計:優化器以為 STATE<100 返回 10 萬行,選擇 I_TYPE 索引,實讀 99,336 行,耗時 0.53 秒。
  • 有分布統計:優化器知曉 STATE<100 僅 1,000 行,選擇 I_STATE 索引,實讀 1,000 行,耗時 0.014 秒,快 36 倍。

生成分布統計

# 僅基本統計
RUNSTATS ON TABLE SAMPLE.CARS AND INDEXES ALL

# 全欄位分布統計
RUNSTATS ON TABLE SAMPLE.CARS WITH DISTRIBUTION AND INDEXES ALL

# 指定欄位及數量
RUNSTATS ON TABLE SAMPLE.CARS WITH DISTRIBUTION ON COLUMNS (TYPE, STATE) AND INDEXES ALL
RUNSTATS ON TABLE SAMPLE.CARS WITH DISTRIBUTION ON COLUMNS (TYPE NUM_FREQVALUES 10 NUM_QUANTILES 20, STATE NUM_FREQVALUES 15 NUM_QUANTILES 30) AND INDEXES ALL

適用條件:欄位有大量重複值(頻率)或值分布不均/聚集(分位數),且用於相應謂詞中。

檢查分布統計是否存在

SELECT * FROM SYSCAT.COLDIST WHERE TABSCHEMA='SAMPLE' AND TABNAME='CARS'

SYSCAT.COLDIST 結構:TYPE (F=頻率, Q=分位數)、SEQNO、COLVALUE、VALCOUNT、DISTCOUNT。

參數標記/主變量對分布統計的影響

JDBC 兩種介面:Statement(字串拼接)與 PreparedStatement(參數標記)。後者編譯時無具體值,優化器無法利用分布統計,導致生成次優計劃(如仍選 I_TYPE 索引)。

範例:SELECT * FROM CARS WHERE STATE < ? AND TYPE = ? 使用參數標記時,即使有分布統計,優化器也無法使用,計劃退化。

建議

  • 對於靜態/動態 SQL 且值已知時,優先使用字串拼接或常量,讓優化器利用分布統計。
  • 必須用 PreparedStatement 時,考慮 REOPT 選項或在應用層處理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved