通過重新生成執行計劃解決綁定變量執行計劃偏差導致SQL執行時間過長
來源:程序員人生 發布時間:2015-01-30 08:13:04 閱讀次數:3177次
基本要素(時間、用戶、問題)
用戶11g環境下有段SQL語句在程序中履行效力非常差,但是在plsql中履行卻很快,通過查看履行計劃,發現使用了不同的索引致使,程序中履行的以下:
PLSQL中履行的效果以下:
可以看到差別,使用門診費用記錄_IX_登記時間索引是在plsql中的履行計劃,使用門診費用記錄_UQ_NO的是程序中的履行計劃,二者SQL是完全相同的,唯1卻別就是前者使用了綁定變量,后者是直接帶參數值履行。
問題分析
問題很明顯,由于綁定變量生成的履行計劃與實際有偏差,11g本來有個綁定變量窺測的功能,但是明顯在這里沒有用,分析極有多是統計信息出現了問題,需要重新對相干業務表進行統計信息搜集,讓相應SQL重新生成履行計劃。
解決步驟
重新搜集下相干業務表的統計信息,這里我們要注意,建議100%的搜集,如果采取采樣搜集,可能沒法準確生成直方圖,一樣會致使履行計劃偏差,履行下面的語句:
exec dbms_stats.gather_table_stats(ownname => 'ZLHIS',tabname =>'門診費用記錄',estimate_percent => 100,method_opt =>'for all indexed columns size 254',no_invalidate => false,cascade => true,force => true,degree =>4);
這里我們加了no_invalidate => false,
該參數表示搜集完統計信息后,重新生成設計該對象的SQL語句的履行計劃,履行完成后,再次查看履行計劃正確,系統正常運行。
關鍵知識點
有綁定變量的SQL語句,如果出現履行計劃偏差,建議重新搜集下相干業務表的統計信息。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈