非常相似的查询之间的巨大性能差异

时间:2014-05-03 16:54:53

标签: performance oracle explain

我很难绕过两个类似查询之间的巨大性能差异。查询#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非常小(数百)。

Query 1

Query 2

1 个答案:

答案 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;系统通过多次运行查询。

请考虑这两种选择,让我们知道您发现了什么:)!