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