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

2015-01-25 20:39:29 · 作者: · 浏览: 38
1 AND "E"."CANCEL_TAG"='0') 34 - filter("E"."USER_ID"=3114042824225916) 36 - access("T3"."SERVICE_ID"(+)="T4"."SERVICE_ID") 38 - access("T1"."PRODUCT_ID"(+)="T4"."PRODUCT_ID") 40 - access("T2"."PACKAGE_ID"(+)="T4"."PACKAGE_ID") Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 7065698 consistent gets 180962 physical reads 2212 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
9,由此可以看出sql在使用差的执行计划时在id=15那里使用了索引跳扫导致代价大增,逻辑读达到700百万,这样问题已经很明确了,就是这个sql导致业务超时。

?

10,通过outline固定执行计划后马上问题就解决了。

?

故障解决

?

1,可以通过hint强制索引

2,使用outline固定执行计划

3,base line固定执行计划

?

解决步骤

?

在这里我使用的是outline的方法:

1,给程序用户赋权

grant create any outline to uop_crm2;

2,创建outline

conn uop_crm2/xxxxxx;

create outline outline_crm2 for category crm2_cat1 on select trade_id,
       accept_month,
       user_id,
       t4.service_id,
       modify_tag,
       t4.start_date,
       t4.end_date,
       item_id,
       user_id_a,
       t4.package_id,
       t4.product_id,
       t1.product_name,
       t2.package_name,
       t3.service_name
  FROM uop_crm2.TD_B_PRODUCT t1,
       uop_crm2.TD_B_PACKAGE t2,
       uop_crm2.TD_B_SERVICE t3,
       (SELECT to_char(0) trade_id,
               0 accept_month,
               to_char(user_id) user_id,
               service_id,
               'A' modify_tag,
               to_char(start_date, 'yyyy-mm-dd hh24:mi:ss') start_date,
               to_char(end_date, 'yyyy-mm-dd hh24:mi:ss') end_date,
               to_char(ITEM_ID) ITEM_ID,
               to_char(USER_ID_A) USER_ID_A,
               PACKAGE_ID,
               PRODUCT_ID
          FROM uop_crm2.tf_f_user_svc a
         WHERE user_id = TO_NUMBER('3114042824225916')
           AND partition_id = MOD(TO_NUMBER('3114042824225916'), 10000)
           AND end_date > sysdate
           AND NOT EXISTS
         (SELECT 1
                  FROM uop_crm2.tf_b_trade_svc b, uop_crm2.tf_b_trade c
                 WHERE c.user_id = TO_NUMBER('3114042824225916')
                   AND c.cancel_tag = '0'
                   AND c.accept_month = TO_NUMBER('11')
                   AND b.trade_id = c.trade_id
                   AND b.accept_month = c.accept_month
                   AND b.modify_tag in ('1', 'B')
                   AND b.product_id = a.product_id
                   AND b.package_id = a.package_id
                   AND b.service_id = a.service_id
                   AND b.start_date = a.start_date)
        UNION ALL
        SELECT to_char(d.TRADE_ID) TRADE_ID,
               d.ACCEPT_MONTH,
               to_char(d.USER_ID) USER_ID,
               SERVICE_ID,
               MODIFY_TAG,
               to_char(START_DATE, 'yyyy-mm-dd hh24:mi:ss') START_DATE,
               to_char(END_DATE, 'yyyy-mm-dd hh24:mi:ss') END_DATE,
               to_char(ITEM_ID) ITEM_ID,
               to_char(d.USER_ID_A) USER_ID_A,
               d.PACKAGE_ID,
               d.PRODUCT_ID
          FROM uop_crm2.TF_B_TRADE_SVC d, uop_crm2.tf_b_trade e
         WHERE e.user_id = TO_NUMBER('3114042824225916')
           AND e.cancel_tag = '0'
           AND e.accept_month = TO_NUMBER('11')
           AND d.trade_id = e.trade_id
           AND d.user_id = TO_NUMBER('3114042824225916')
           AND d.accept_month = TO_NUMBER('11')
           AND d.modify_tag in ('0', 'A')
           AND NOT EXISTS
         (SELECT 1
                  FROM uop_crm2.tf_b_trade_svc
                 WHERE trade_id = TO_NUMBER('3114111918985865')
                   AND accept_month = TO_NUMBER('11')
                   AND modify_tag in ('1', '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)
        UNION ALL
        SELECT to_char(d.TRADE_ID) TRADE_ID,
               d.accept_month H,
               to_char(d.USER_ID) USER_ID,
               SERVICE_ID,
               MODIFY_TAG,
               to_char(START_DATE, 'yyyy-mm-dd hh24:mi:s