我正在使用现有的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正在发生吗?
答案 0 :(得分:2)
原因是在输出行时会在行上生成ROWNUM。
你的第一个查询没有critera,因此它将吐出前3行并完成它。您通常可以找到任何匹配得非常快的3行。
你的第二行必须找到符合条件的3行才能停止(并且它可能永远不会找到这3行)。
查询完全不同,因此执行的时间不同。
快速运行的方法是索引c.banner_id(事实上,你所有的FK)。
oops - 刚刚注意到另一个答案的时间戳。无论如何,我会把它留在这里,因为它确实回答了问题,其中一条评论也是如此。