對百萬列資料表執行 RUNSTATS ... ALLOW WRITE ACCESS 並啟用分布統計與索引採樣時,若採樣期間持續有資料寫入,極易產生表統計與索引統計的「時間點不一致」。
TABLES.CARD = 1,100,000INDEXES.FIRSTKEYCARD = 1,110,000結果:FIRSTKEYCARD (1,110,000) > CARD (1,100,000),後續在測試環境注入此統計時,UPDATE SYSSTAT.INDEXES 會拋出 SQL1227N rc=8。
FIRSTKEYCARD、FULLKEYCARD、NUMRIDS 降為 1,100,000(等於表 CARD)。TABLES.CARD 提升至 1,110,000(等於索引基數),但需同步調整 NPAGES、FPAGES 等衍生值,風險較高。執行 db2look -m 產出腳本後,務必在測試環境執行前,以腳本或人工檢查所有下列不一致:
FIRSTKEYCARD / FULLKEYCARD / NUMRIDS ≤ TABLES.CARDCARD 之和 = 表級 CARDNLEAF / NLEVELS 與實際索引深度合理CLUSTERRATIO / CLUSTERFACTOR 在 [-1, 100] 範圍內AVERAGE_* 欄位非負且邏輯自洽建議開發「統計一致性預檢工具」,解析 db2look 輸出,自動標記並修正違規行,再寫回乾淨腳本,保證 db2 -tvf db2look.out 零錯誤執行。
生產環境查詢回傳 SQL0437W rc=1(陳述式複雜度超過資源限制),但測試環境不復現。
CURRENT QUERY OPTIMIZATION 設定相同。MAX_STMT_CONCURRENCY、DB2_OPT_MAX_TEMP_SIZE、DB2_SORT_AFTER_TQ 等登錄變數。同樣方法可重現 SQL0437W rc=2、SQL0101N、SQL0901N 甚至編譯器/優化器內部斷點(trap/abend)。
成功重現問題後,可在不影響生產的前提下:
SET CURRENT QUERY OPTIMIZATION)db2look 是重現優化器與編譯器問題的終極利器。掌握「收集 → 修正不一致 → 部署 → 驗證 → 實驗」完整流程,能將生產環境的疑難雜症安全轉移至測試環境逐一擊破,極大提升 DBA 調優效率與信心。