【发布时间】:2014-10-24 15:29:52
【问题描述】:
我在面试中被问到一个问题。
下面两个 SQL 将得到相同的结果。但哪个性能更高?
SELECT * FROM EMP WHERE DEPTNO >= 4
SELECT * FROM EMP WHERE DEPTNO > 3
答案是第一个。 在第一个 SQL 中,数据库将直接在搜索的地方定位 DEPT =4。它具有更高的性能。 在第二条 SQL 中,数据库将定位 DEPT =3,并向前扫描大于 3 的行。
这是我第一次听到这个理论。我看不出执行计划和统计数字有什么区别。
官方有解释吗?
我发现一些中文网站也有相同的提示。
http://edm.ares.com.tw/dm/newsletter-2014-03-uPKI-OTP-newrelease/it-1.php
【问题讨论】:
-
可能在 Oracle 0.1 版中? Oracle 的 CBO 具有重写查询的能力,所以即使它是真的,今天也不会成立。
-
如果 A 上有索引,我会同意(无需深入研究优化器)
-
假设你在谈论 b-tree 索引,look at the internal structure。它只会查看从第一个包含 > 2 的叶节点开始的叶节点,然后找到第一个叶节点的分支节点将意味着完成了相同数量的工作。 (虽然我认为它是一个数字,而不是整数列,第二个可以查询实际上可以返回更多数据......)。如果没有索引,则会对两者进行全表扫描。
-
即使这个解释是正确的,我们谈论的是微秒来增加一个计数器。我刚刚在 PL/SQL 中分析了(比正常慢)这 1m 次(比 C 慢很多)。花费了 0.531 秒,其中 205/279 的时间用于增加计数器以确保 PL/SQL 不会优化整个循环。这意味着 PL/SQL 中的单个增量(慢记)约为 1.4xE-7 秒,即 140ns。小到无关紧要——假设这个理论是真的。
-
想一想,如果表确实包含从 1 到 10000 的整数,那么无论如何它都会对这两个查询进行全索引扫描或全表扫描...这可能就是你记得你是作为潜在雇主面试他们的,他们也在面试你。
标签: sql database oracle performance