【问题标题】:Why is it that the IsEqual (=) operator is working faster than the IsNotEqual (<>) operator in Oracle?为什么 IsEqual (=) 运算符比 Oracle 中的 IsNotEqual (<>) 运算符运行得更快?
【发布时间】:2011-03-22 02:48:27
【问题描述】:

正如标题所说,如果有人有答案,我想知道。我一直在谷歌搜索,但找不到一个直接的答案。

例子:

这行得通

SELECT COUNT(*) FROM Table1 TB1, Table2 TB2
WHERE TB1.Field1 = TB2.Table2 

这似乎需要几个小时

SELECT COUNT(*) FROM Table1 TB1, Table2 TB2
WHERE TB1.Field1 <> TB2.Table2 

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    因为它们是不同的 SQL 语句。在第一个中,您将使用 Field1Table2 字段连接两个表。可能会返回一些记录。

    在第二个中,您的查询可能返回大量记录,因为您正在执行交叉连接,并且很多行将满足您的 Field1 &lt;&gt; Table2 条件。

    一个非常简单的例子

    表1

    Field1
    ------
    1
    2
    5
    9
    

    表2

    Table2
    ------
    3
    4
    5
    6
    9
    

    Query1 将返回 2,因为只有 5 和 9 是常见的。

    Query2 将返回 18,因为来自交叉连接的很多行都会计算在内。

    如果您的表中有很多记录,则处理第二个查询需要一段时间。

    【讨论】:

    • 有趣!您的帖子类似于 Joachim Sauer 的帖子。你的帖子和他的结合是一个很好的组合。
    【解决方案2】:

    重要的是要认识到 SQL 是一种声明性语言,而不是命令性语言。您描述了希望数据适合的条件,而不是应该如何执行这些比较。数据库的工作是找到最快的方式给你答案(由query optimizer 接管的任务)。这意味着查询中看似很小的更改可能会导致查询计划大不相同,进而导致运行时行为大相径庭。

    = 比较可以转换为和优化,方法与两个字段上的简单连接相同。这意味着可以使用普通索引非常快速地执行查询,可能无需读取实际数据而仅使用索引。

    另一方面,&lt;&gt; 比较通常需要计算和检查完整的cartesian product 条件(可能有一种方法可以使用正确的索引来优化它,但通常索引无济于事这里)。它通常还会返回更多结果,这会增加执行时间。

    【讨论】:

    • 感谢您的解释。现在清楚了很多。你的帖子与 Pablo 的结合很有意义。
    【解决方案3】:

    可能第二个查询比第一个查询处理方式更多的行。

    【讨论】:

      【解决方案4】:

      (回想similar question

      您是否尝试计算Table1 中在Table2 中没有匹配记录的行?

      如果是这样,你可以使用它

      SELECT COUNT(*) FROM Table1 TB1
      WHERE NOT EXISTS
           (SELECT * FROM Table2 TB2 
            WHERE TB1.Field1 = TB2.Field2 )
      

      或者这个例子

      SELECT COUNT(*)
      FROM
      (
      SELECT Field1 FROM Table1 
      MINUS
      SELECT Field2 FROM Table2
      ) T
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多