2

我正在使用一个现有的 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 有大约 3 亿个条目,而其他条目要小得多。)我想这与索引有关——有人可以指点我一本关于数据库算法的书(比如查询实际上是如何在后端工作的)所以我可以理解 wtf 是怎么回事吗?

4

1 回答 1

2

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

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

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

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

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

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

于 2013-07-19T07:31:04.533 回答