我在面试中被问了一个问题。
下面两个SQL会得到相同的结果。但哪一个有更高的表现?
SELECT * FROM EMP WHERE DEPTNO >= 4
SELECT * FROM EMP WHERE DEPTNO > 3
答案是第一个。 在第一个SQL中,数据库将直接在搜索位置找到DEPT = 4。它具有更高的性能。 在第二个SQL中,Database将定位DEPT = 3,并向前扫描大于3的行。
这是我第一次听说这个理论。我看不出执行计划和统计编号有什么区别。
有没有官方解释呢?
我发现一些中文网站分享了相同的提示。
http://edm.ares.com.tw/dm/newsletter-2014-03-uPKI-OTP-newrelease/it-1.php
答案 0 :(得分:2)
如果列在该字段上有索引,我发现这是一个神话。我尝试使用主键,两个执行计划都使用索引范围扫描,这在主键或唯一索引上非常快。这两个查询的性能非常接近,两者都返回相似的成本,但是“>”的成本相同估计的CPU成本比“> =”好0.3%。我说BUSTED!
此外,当我说某些内容表现更好时,通常我的意思是10%+即使不是更多。
答案 1 :(得分:0)
我不是100%肯定,但是如果您创建了一个具有大PCTFREE的索引,并且您能够强制在一个叶块中具有值3,而值4则在另一个叶块中。 (这可以通过ALTER DATABASE DUMP BLOCK
验证)。如果你强迫Oracle使用索引范围扫描。
然后,您可以从跟踪中看到一个查询处理的页面多于另一个查询页面。