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 = ? 使用參數標記時,即使有分布統計,優化器也無法使用,計劃退化。
PreparedStatement 時,考慮 REOPT 選項或在應用層處理。