ORACLE analyse table方式收集表統計資訊導致SQL執行計劃不準確而效能下降
最近,遇到一客戶,反饋業務響應慢,經過分析後最後鎖定到平時執行不到1秒的SQL語句,今天突然執行時間變成
半分鐘。處理過程如下:
取問題時段的AWR,檢視資料庫負載,發現資料庫負載不高:
檢視資料庫頂級等待事件,發現是檔案離散讀,基本可以鎖定是表掃描相關的問題:
檢視問題SQL,Order by Elapsed Time,發現一條執執行次數不算多,執行耗時特別長的SQL:
如圖SQL ordered by Elanpsed Time所示, 是fbh8jvk9fvdkh,平均執
行時長239.54s,經與甲方人員核實是監控到的慢業務SQL語句。
將問題SQL改造,方便效能測試,改造後的語句如下(sql_tun110是為了方便找SQL_ID):
select /*+sql_tun110*/count(*) from ( select q.vc_profitclass, ot.d_date, ot.d_cdate, ot.c_fundcode, q.vc_fundname, ot.F_Netvalue, ot.F_Incomeunit, ot.F_Incomeratio, ot.F_Incomeratio_30days from datacenter.crm_tfundday ot, datacenter.crmmg_tfundtypeset q, (select max(t.d_date) as ddate, t.c_fundcode from datacenter.crm_tfundday t where nvl(t.f_incomeunit, 0) >= 0 group by t.c_fundcode) it where q.vc_fundcode = ot.c_fundcode and ot.d_date = it.ddate and ot.c_fundcode = it.c_fundcode ) t;
獲取上述SQL的執行計劃:
如圖上所示,問題SQL執行計劃顯示其Cost值只有61,但是consistent gets有5274937之多,可以確認是sql語句的
執行計劃出現問題導致sql效能下降。經過與甲方人員溝通,得知上午對datacenter以analyse table的方式進行過統
計資訊收集,經進一步查詢最近只有2018年6月13日執行過統計資訊收集如下圖所示。
因此得出結論: 。
重新更新表的統計資訊:
execute dbms_stats.gather_index_stats(ownname => 'DATACENTER', indname =>'PK_TFUNDTYPESET', estimate_percent =>DBMS_STATS.AUTO_SAMPLE_SIZE); execute dbms_stats.gather_table_stats(ownname => 'DATACENTER', tabname =>'CRMMG_TFUNDTYPESET', estimate_percent =>DBMS_STATS.AUTO_SAMPLE_SIZE, method_opt => 'FOR ALL COLUMNS SIZE AUTO');
驗證效果,原先SQL的邏輯讀5274937降低到6290,SQL原先執行30多秒,現在執行耗時0.6秒:
最佳化前的執行對比:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29357786/viewspace-2218303/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【YashanDB知識庫】收集分割槽表統計資訊取樣率小於1導致SQL執行計劃走偏SQL
- 【統計資訊】Oracle常用的收集統計資訊方式Oracle
- Oracle sql執行計劃OracleSQL
- 【TABLE】Oracle表資訊收集指令碼Oracle指令碼
- Oracle收集統計資訊Oracle
- 通過鎖定表的統計資訊來穩定sql的執行計劃SQL
- 【PG執行計劃】Postgresql資料庫執行計劃統計資訊簡述SQL資料庫
- Oracle SQL Profile固定執行計劃的方法OracleSQL
- Oracle優化案例-統計資訊對執行計劃的影響(十三)Oracle優化
- Oracle資料庫關於SQL的執行計劃(轉)Oracle資料庫SQL
- 【TUNE_ORACLE】定製化收集統計資訊SQL參考OracleSQL
- 微課sql最佳化(3)、統計資訊收集(2)-如何收集統計資訊SQL
- oracle 統計資訊檢視與收集Oracle
- 【SQL】Oracle資料庫資料量及效能資訊收集SQLOracle資料庫
- oracle 固定執行計劃Oracle
- 成為MySQL DBA後,再看ORACLE資料庫(十四、統計資訊與執行計劃)MySqlOracle資料庫
- ORACLE表統計資訊與列統計資訊、索引統計資訊Oracle索引
- .Oracle固定執行計劃之SQL PROFILE概要檔案OracleSQL
- Oracle統計資訊的收集和維護Oracle
- Oracle運維指令碼-收集統計資訊Oracle運維指令碼
- SQL執行計劃異常引起的效能問題SQL
- SQL執行計劃異常 引起的效能問題SQL
- 【執行計劃】Oracle獲取執行計劃的幾種方法Oracle
- [統計資訊系列7] Oracle 11g的自動統計資訊收集Oracle
- 【TUNE_ORACLE】定製化執行計劃SQL參考OracleSQL
- Oracle檢視sql_id 的歷史執行計劃OracleSQL
- 獲取oracle sql語句詳細些執行計劃OracleSQL
- Oracle當number型別超過一定長度直方圖限制導致SQL執行計劃錯誤Oracle型別直方圖SQL
- spark sql語句效能最佳化及執行計劃SparkSQL
- 【SCRIPT】Oracle統計資訊相關SQLOracleSQL
- 微課sql最佳化(8)、統計資訊收集(6)-統計資訊查詢SQL
- 手動收集——收集統計資訊
- SQLServer統計監控SQL執行計劃突變的方法SQLServer
- MySQL 因資料型別轉換導致執行計劃使用低效索引MySql資料型別索引
- 【統計資訊】Oracle統計資訊Oracle
- 收集統計資訊方案
- Oracle優化案例-從執行計劃定位SQL問題(三)Oracle優化SQL
- Oracle-繫結執行計劃Oracle