WHERE empno='000020' vs '000070'),仍各自編譯。DB2 V9.7 推出:修改動態 SQL 文本,使相似語句共享同一執行計劃。字面值被參數標記 (如 :L0) 取代。
db2 update db cfg for sample using STMT_CONC LITERALS (預設 OFF)。前 100,000 個字面值替換,其餘保持。db2cli.ini 設 StmtConcentrator=WITHLITERALS (OFF 關閉)。影響 SQL_ATTR_STMT_CONCENTRATOR 屬性,ODBC/JDBC 程式可直接設連接屬性。建議優先用客戶端級:控制粒度更細、全 DB2 產品線一致方式。啟用後,原始語句與修改後語句均顯示於 Explain 輸出;事件監視器、MON_GET_ACTIVITY_DETAILS 顯示原始語句,其他監視介面顯示修改後文本。
-- 啟用 STMT_CONC LITERALS
SELECT firstnme,lastname FROM employee WHERE empno='000020';
SELECT firstnme,lastname FROM employee WHERE empno='000070';
-- get snapshot for dynamic sql
-- 結果:兩原始 SQL 編譯/執行數為 0;參數化語句 'empno=:L0' 編譯 1 次、執行 2 次、編譯時間 218ms
語句集中改變文本,影響執行計劃選擇。適用:包緩存中相似語句大量重複執行。不適用:不同字面值導致計劃顯著不同 (如數據嚴重傾斜)。
Col2=1:索引掃描 + RID 回表,成本 15.16,回 1.57 行Col2=5:全表掃描,成本 953.76,回 90,001 行| STMT_CONC=OFF | STMT_CONC=LITERALS | |
|---|---|---|
| Col2=1 | 0.607 秒 | 0.732 秒 |
| Col2=5 | 17.73 秒 | 21.65 秒 |
Col2=5 時因計劃錯誤多花 ~3 秒。
STMT_CONC 參數;精確控制用客戶端 StmtConcentrator。