我很难绕过两个类似查询之间的巨大性能差异。查询#1:
SELECT a.waferid,
a.channelid,
b.originalname,
b.translatedname,
a.seriesdata
FROM
(SELECT * FROM T_RT_WAFERDATA s WHERE s.waferid IN (686)
) a,
T_RT_EQUIPMENTCHANNELS b
WHERE a.channelid = b.channelid
查询#2:
SELECT a.waferid,
a.channelid,
b.originalname,
b.translatedname,
a.seriesdata
FROM t_rt_waferdata a,
T_RT_EQUIPMENTCHANNELS b
WHERE a.waferid IN (686)
AND a.channelid = b.channelid
解释计划为两个查询产生相同的复杂性(10),但第二个查询比第一个慢大约两个数量级。
我有什么明显的遗失吗?
编辑:T_RT_WAFERDATA.waferid是PK,T_RT_EQUIPMENTCHANNELS.channelid也是PK。 T_RT_WAFERDATA相对较大(数百万行),而T_RT_EQUIPMENTCHANNELS非常小(数百)。
答案 0 :(得分:1)
首先,改变SQL BLOCK的形式对计划没有任何作用,Oracle非常聪明,可以将查询块转换为最佳形式(可能是子查询在这里取消,使用10053跟踪优化器以确保这一点)。
其次,这些计划来自哪里? 10046跟踪将给出实际执行计划的确切答案,请记住解释计划并不总是检索Oracle在实际查询执行发生的最后一分钟选择的计划。
第三,尝试使用/*+GATHER_PLAN_STATISTICS*/
运行两个SQL,并使用DBMS_XPLAN.DISPLAY_CURSOR拉出计划。这是一篇关于如何执行此操作的好文章:https://blogs.oracle.com/optimizer/entry/how_do_i_know_if
第四,你如何编写你的sql与性能的数量级无关,我认为你可能会受到以下任何一个原因的影响:
1.-实例减速(检查awr和灰分报告确定)。
2.-如果您通过一个接一个地运行一个SQL来对此进行基准测试,最可能的原因是数据被缓存。确认这一点的一种方法是执行alter system flush buffer_cache
执行query1,然后alter system flush buffer_cache
执行query2。为了排除其他形式的缓存,它可能有助于“热身”#34;系统通过多次运行查询。
请考虑这两种选择,让我们知道您发现了什么:)!