【故障处理141119】一次数据库不繁忙时一条sql语句2个执行计划导致业务超时的故障处理(二)

2015-01-25 20:39:29 · 作者: · 浏览: 28
225916 AND "PARTITION_ID"=5916) 12 - filter("C"."ACCEPT_MONTH"=11 AND "C"."CANCEL_TAG"='0') 13 - access("C"."USER_ID"=3114042824225916) 15 - access("B"."TRADE_ID"="C"."TRADE_ID" AND "B"."ACCEPT_MONTH"=11 AND "B"."SERVICE_ID"="A"."SERVICE_ID" AND "B"."START_DATE"="A"."START_DATE" AND "B"."PRODUCT_ID"="A"."PRODUCT_ID" AND "B"."PACKAGE_ID"="A"."PACKAGE_ID") filter("B"."START_DATE"="A"."START_DATE" AND "B"."SERVICE_ID"="A"."SERVICE_ID" AND "B"."PRODUCT_ID"="A"."PRODUCT_ID" AND "B"."PACKAGE_ID"="A"."PACKAGE_ID" AND ("B"."MODIFY_TAG"='1' OR "B"."MODIFY_TAG"='B')) 18 - filter("E"."ACCEPT_MONTH"=11 AND "E"."CANCEL_TAG"='0') 19 - access("E"."USER_ID"=3114042824225916) 22 - access("D"."TRADE_ID"="E"."TRADE_ID" AND "D"."ACCEPT_MONTH"=11 AND "D"."USER_ID"=3114042824225916) filter("D"."MODIFY_TAG"='0' OR "D"."MODIFY_TAG"='A') 24 - access("TRADE_ID"=3114111918985865 AND "ACCEPT_MONTH"=11 AND "SERVICE_ID"="D"."SERVICE_ID" AND "START_DATE"="D"."START_DATE" AND "PRODUCT_ID"="D"."PRODUCT_ID" AND "PACKAGE_ID"="D"."PACKAGE_ID") filter(("MODIFY_TAG"='1' OR "MODIFY_TAG"='B') AND "PRODUCT_ID"="D"."PRODUCT_ID" AND "PACKAGE_ID"="D"."PACKAGE_ID" AND "SERVICE_ID"="D"."SERVICE_ID" AND "START_DATE"="D"."START_DATE") 28 - filter(("D"."MODIFY_TAG"='1' OR "D"."MODIFY_TAG"='B') AND "D"."START_DATE"<"D"."END_DATE" AND "D"."END_DATE">SYSDATE@! AND "D"."ACCEPT_MONTH"=11) 29 - access("D"."USER_ID"=3114042824225916) 30 - access("D"."TRADE_ID"="E"."TRADE_ID" AND "E"."ACCEPT_MONTH"=11 AND "E"."CANCEL_TAG"='0') 31 - filter("E"."USER_ID"=3114042824225916) 33 - access("T3"."SERVICE_ID"(+)="T4"."SERVICE_ID") 35 - access("T1"."PRODUCT_ID"(+)="T4"."PRODUCT_ID") 37 - access("T2"."PACKAGE_ID"(+)="T4"."PACKAGE_ID") Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 82 consistent gets 0 physical reads 0 redo size 2390 bytes sent via SQL*Net to client 520 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 15 rows processed SQL>
6,执行很快,于是让应用开发人员在该sql执行前后加一个时间输出到日志里面,看看sql到底执行了多长时间,测试结果是58秒。

?

7,此时就确认应该sql在sqlplus和程序里的执行计划不一样,于是考虑针对sql_id:1huatx9vws2u3做一个sqlrpt。

\

8,为了再现这个差的执行计划是否真的执行很长时间,于是对该sqlid做了一个advanced的执行计划显示,并取出其中的差的Outline Data添加到sql里面然后再次执行。

?

SQL> select * from table(dbms_xplan.display_cursor('1huatx9vws2u3',null,'advanced'));

把plan hash value为353242268 outline data拿出来,outline data其实就是个hint,加到select后面,再现差的执行计划的执行效率:

?

?

SELECT /*+                                                                                                                                                                                                                                     
      BEGIN_OUTLINE_DATA                                                                                                                                                                                                                  
      IGNORE_OPTIM_EMBEDDED_HINTS                                                                                                                                                                                                         
      OPTIMIZER_FEATURES_ENABLE('11.2.0.4')                                                                                                                                                                                               
      DB_VERSION('11.2.0.4')                                                                                                                                                                                                              
      ALL_ROWS                                                                                                                                                                                                                            
      OUTLINE_LEAF(@"SEL$2AD7F9D9")
      PUSH_PRED(@"SEL$B29E968D" "VW_SQ_1"@"SEL$E9784550" 7 6 5 4)                                                                                                                                                                         
      OUTLINE_LEAF(@"SEL$B29E968D")                                                                                                                                                                                                       
      UNNEST(@"SEL$3")                                                                                                                                                                                                                    
      OUTLINE_LEAF(@"SEL$385088EC")                                                                                                                                                                                                       
      UNNEST(@"SEL$5")                                                                                                                                                                                                                    
      OUTLINE_LEAF(@"SEL$6")                                                                                                                                                                                                              
      OUTLINE_LEAF(@"SET$1")                                                                                                                                                                                                              
      OUTLINE_LEAF(@"SEL$1")                                                                                                                                                                                                              
      OUTLINE(@"SEL$291F8F59")                                                                                                                                                                                                            
      OUTLINE(@"SEL$B29E968D")                                                                                                                                                                                                            
      UNNEST(@"SEL$3") 
      OUTLINE(@"SEL$E9784550")                                                                                                                                                                                                            
      OUTLINE(@"SEL$3")                                                                                                                                                                                                                   
      OUTLINE(@"SEL$4")                                                                                                                                                                                                                   
      OUTLINE(@"SEL$5")                                                                                                                                                                                                                   
      OUTLINE(@"SEL$2")                                                                                                                                                                                                                   
      NO_ACCESS(@"SEL$1" "T4"@"SEL$1")                                                                                                                                                                                                    
      INDEX_RS_ASC(@"SEL$1" "T3"@"SEL$1" ("TD_B_SERVICE"."SERVICE_ID"))                                                                                                                                                                   
      INDEX_RS_ASC(@"SEL$1" "T1"@"S