ENABLE_FLAG 的統計信息中 DENSITY 錯誤,導致優化器誤估基數為 1 行;DENSITY,目標庫 9.2.0.4 使用了該值,故僅目標庫發病。排查發現:源庫 9.2.0.1 並非數據真正源頭,真實源頭為 10.2.0.3。
SELECT COLUMN_NAME, NUM_DISTINCT, NUM_NULLS, DENSITY, NUM_BUCKETS, HISTOGRAM
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME='ORD_HIT_COMM' AND COLUMN_NAME='ENABLE_FLAG';
結果:
ENABLE_FLAG 2 0 2.8355E-07 2 FREQUENCY
HISTOGRAM = FREQUENCY:10g 引入的頻率直方圖,NUM_BUCKETS = NUM_DISTINCT;DENSITY 計算方式與舊版 HEIGHT BALANCED 截然不同,極小值(2.8E-7)反映極高選擇性。HISTOGRAM 類型,結合直方圖桶信息正確估算基數(169 萬行);HISTOGRAM 列,無法識別直方圖類型;HEIGHT BALANCED 直方圖,直接使用 DENSITY 估算,導致基數錯估為 1 行;-- 10g 正確計劃
EXPLAIN PLAN FOR SELECT * FROM ORD_HIT_COMM WHERE ENABLE_FLAG='1';
-- 顯示全表掃描,基數 1691K
-- 9i 導入統計後錯誤計劃
-- 顯示索引範圍掃描,基數 1
DBMS_STATS.GATHER_TABLE_STATS,生成匹配版本的統計信息;HISTOGRAM、DENSITY、NUM_BUCKETS 等新列的兼容性;DBMS_STATS.LOCK_TABLE_STATS 防止自動採集產生波動。統計信息不可跨主版本直接遷移。10g 引入的頻率直方圖與 9i 的元數據結構不兼容,導致優化器誤讀 DENSITY,引發連鎖性能災難。重新採集是唯一正確出路。