虽然我并不推荐在sql调优的时候使用Hint,因为我觉得在绝大多数情况下,如果表设计的好,索引建的对,sql编写避免常见的误区,cbo已经很聪明了。
下午做了一个sql的调优,用了NO_MERGE提示,开始这个查询时间用了40秒,调整后的sql用了3秒。主要是因为Oracle重写了这个视图引起的。
select
s.outage_id OUTAGE_ID,
S.OUTAGE_TYPE,
S.status_cd,
to_number(NULL),
'',
DECODE(t.LINE_ITEM_STATUS_CD,
'ETCSTA2',
'A',
'ETCSTA3',
'COMP',
'ETCSTA5',
'EA',
'ETCSTA4',
'EP',
'ETCSTA6',
'ER',
'ETCSTA1',
'I',
'ETCSTA7',
'PA',
'ETCSTA22',
'PP',
'ETCSTA21',
'PR',
'ETCSTA23',
'P',
NULL) STATUS_CODE,
'',
t.issue_dt,
s.scheduled_start_dt
from ETCHT_LINE_ITEM_TRANS t,
CTSV_OUTAGE_EVENT s,
CTST_EQUIPMENT EQ,
LOV_PRPTY LPT,
LOV_PRPTY LFRM
where s.GEN_UNIT_ID = 31280
AND (s.outage_id = t.outage_id OR
(s.ETECH_STATUS_CD = 'O' AND t.outage_id IS NULL))
and s.outage_id = t.outage_id(+)
and s.status_cd NOT IN ('READY for outage')
and s.outage_id is not NULL
AND s.UNIT_NUMBER_ID = EQ.UNIT_NUMBER_ID
AND EQ.TECHNOLOGY_TYPE_CD = LPT.LOV_PRPTY_ID
AND EQ.FRAME_SIZE_ID = LFRM.LOV_PRPTY_ID
AND s.ETECH_STATUS_CD IN ('O', 'RF', 'OC')
AND s.OUTAGE_TYPE <> 'UU'
AND LFRM.VAL_NM = 'HEAVYDUTY'
AND ((LPT.VAL_CD IN ('JMG', 'JMS', 'J4', 'J1', 'J3', 'J2') AND
s.OUTAGE_TYPE <> 'MINOR') OR
(LPT.VAL_CD IN ('JMS', 'J1', 'J2') AND s.OUTAGE_TYPE = 'MINOR'))
AND EQ.SERVICE_RELATIONSHIP_NM IN ('CSAHV', 'OMCSAHV', 'CSALV', 'OMCSALV',
'CSAMV', 'OMCSAMV', 'OM', 'OGCSA')
执行计划:
用了NO_MERGE提示之后的执行计划:
虽说某些时候可能会需要hint,但是我原则上还是很少使用的,而且我认为使用hint主要是为了稳定一些。
在某些Oracle重写了视图的情况下,使用该提示可能会有帮助。
阅读(2313) | 评论(0) | 转发(0) |