【问题标题】:Oracle SQL Operator >= has higher performance than >Oracle SQL Operator >= 的性能高于 >
【发布时间】: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


【解决方案1】:

如果该列在该字段上具有索引,我认为这是一个神话。我尝试使用主键,两个执行计划都使用索引范围扫描,这在主键或唯一索引上非常快。这两个查询的性能非常接近,并且都返回相似的成本,但是带有“>”的查询在估计的 CPU 成本上比“>=”高 0.3%。我说破产了!

此外,当我说某项性能更好时,通常我的意思是 10% 以上,如果不是更多的话。

【讨论】:

    【解决方案2】:

    我不是 100% 确定,但是如果您创建了一个具有大 PCTFREE 的索引,并且您能够强制在一个叶块中具有值 3,而值 4 在另一个叶块中。 (这可以通过ALTER DATABASE DUMP BLOCK 进行验证)。如果你强制 Oracle 使用索引范围扫描。

    那么也许您可以从跟踪中看到一个查询处理的页面比另一个多一页。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-06
      • 2021-03-13
      • 2019-05-23
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 2014-01-04
      相关资源
      最近更新 更多