了解sql查询次数

时间:2012-11-15 15:37:51

标签: sql performance oracle

我正在使用现有的Oracle数据库(我没有构建,并且除了表结构之外一无所知)。有些查询非常快,其他看似非常相似的查询非常慢。例如

SELECT a.price, c.banner_id, c.short_name
FROM ret_price_current a
  JOIN ret_store b ON a.store_id = b.store_id
  JOIN ret_banner c ON b.banner_id = c.banner_id
  JOIN ret_store2cbsa_csa d ON a.store_id = d.store_id
WHERE rownum<3

(1.09, 74, 'Safeway')
(1.09, 74, 'Safeway')
that took 0.243073940277 seconds

但如果我添加一个看似简单的WHERE条件:

SELECT a.price, c.banner_id, c.short_name
FROM ret_price_current a
  JOIN ret_store b ON a.store_id = b.store_id
  JOIN ret_banner c ON b.banner_id = c.banner_id
  JOIN ret_store2cbsa_csa d ON a.store_id = d.store_id
WHERE c.banner_id = 74
  AND rownum<3

它已经运行而没有返回很多分钟了。到底是怎么回事? (作为参考,ret_price_current有大约300米的条目而其他的条目要小得多。)我想它与索引有关 - 有人可以指向我一本关于数据库算法的书(比如查询实际上如何在后端工作)所以我可以理解wtf正在发生吗?

1 个答案:

答案 0 :(得分:2)

原因是在输出行时会在行上生成ROWNUM。

你的第一个查询没有critera,因此它将吐出前3行并完成它。您通常可以找到任何匹配得非常快的3行。

你的第二行必须找到符合条件的3行才能停止(并且它可能永远不会找到这3行)。

查询完全不同,因此执行的时间不同。

快速运行的方法是索引c.banner_id(事实上,你所有的FK)。

oops - 刚刚注意到另一个答案的时间戳。无论如何,我会把它留在这里,因为它确实回答了问题,其中一条评论也是如此。