【问题标题】:Which conditional statement is faster in SQL?SQL中哪个条件语句更快?
【发布时间】:2009-08-12 19:39:34
【问题描述】:
SELECT a, b FROM products WHERE (a = 1 OR b = 2)

或者...

SELECT a, b FROM products WHERE NOT (a != 1 AND b != 2)

这两个语句应该达到相同的结果。但是,第二个避免了 SQL 中臭名昭著的慢速“OR”操作数。这会使第二个语句更快吗?

【问题讨论】:

    标签: sql optimization conditional


    【解决方案1】:

    传统上,后者更容易让优化器处理,因为它可以轻松地将 and 解析为 s-arg,这(粗略地说)是一个可以使用索引解析的谓词。

    从历史上看,查询优化器无法将 OR 语句解析为 s-args,使用 OR 谓词的查询无法有效利用索引。因此,建议是避免它并按照后一个示例的术语重新转换查询。最近的优化器更擅长识别适合这种转换的 OR 语句,但复杂的 OR 语句仍可能使它们混淆,从而导致不必要的表扫描。

    这就是“OR 很慢”模因的由来。性能与处理表达式的效率无关,而是优化器识别利用索引的机会的能力。

    【讨论】:

    • 优秀的答案。这有点像我怀疑的。我只是想知道最新版本的 Microsoft SQL 是什么地方没有这种优化。
    • 第一个 Guru's Guide boox 深入讨论了 s-args,它是为 SQL Server 7.0 编写的。查询优化器在 6.5 和 7.0 之间完全重新散列,并在 2000 年再次重新散列(主要是添加并行性)。这表明(至少)7.0 不太擅长用 OR 语句做聪明的事情。
    • 对我来说已经足够了。对于某些应用程序,我们仍然使用 SQL 2000,但不是 7。我已经在 SQL 2000 中测试了这个理论,但在性能方面没有发现任何明显的差异。通过您的附加评估,我相当有信心使用更具可读性的 OR 语法保留语句是可行的方法。
    【解决方案2】:

    不,a != 1 和 b != 2 与 a = 1 或 b = 2 相同。

    查询优化器将为两者运行相同的查询计划,至少在任何稍微复杂的 Sql 实现中。

    【讨论】:

    • 吹毛求疵:你漏掉了NOT。你提到的两种表达方式并不相同。
    • 哈,不仅如此,而且 De Morgan 仅适用于布尔代数,而不是 SQL 中棘手的三态真/假/空混乱
    【解决方案3】:

    SQL 中没有固有的慢或快运算符。当您发出查询时,您描述了您想要的结果。如果两个语义相同的查询(尤其是像这样的简单查询)产生非常不同的运行时间,那么您的 SQL 实现就不是很聪明。

    【讨论】:

      【解决方案4】:

      SQL Server 在优化之前重写所有查询,并且很可能两个查询在重写之后将是相同的。 您可以在 SSMS 中检查它们的执行计划,只需按 Ctrl+L,它们很可能是相同的。

      同时运行以下命令:

      SET STATISTICS IO ON;
      SET STATISTICS TIME ON;
      

      然后重新运行您的查询 - 您应该会看到相同的实际执行成本。

      【讨论】:

      • 我刚才试了一下,执行计划看起来是一样的。然而,执行计划是否总能说明问题?
      • 是的,执行计划是优化器决定要做的,所以它会反映现实。
      • @TheSteve:我添加了有关实际执行成本的信息。
      【解决方案5】:

      在这种情况下,理想情况下 OR 应该更快,因为对于每 n 步,如果它已经找到 a=1,那么它将不会测试第二个条件。也没有涉及逆运算符(NOT)。

      但是,如果 AND 为真,SQL 必须同时测试这两个条件,因此每 n 步计算 2n 个条件,而 OR 中的 else 条件的数量将始终小于 2n。此外,它还有一个额外的运算符需要评估。

      但是,如果 a 或 b 之一被索引,则查询执行计划可能会有所不同,因为索引列比较涉及对单个比较结果集的交叉和联合连接操作!!

      此外,将 OR 视为慢速运算符也是错误的,当您考虑在多个表上进行连接的复杂查询时,正如其他贡献者在此问题中提到的那样,时间 OR 可能是一个大问题。但对于较小的查询,OR 应该没问题。事实上,每个查询都有其自身的挑战,它不仅取决于帮助文件中记录的内容,还取决于您的数据分布方式、重复和方差因素。

      【讨论】:

      • 当第一个表达式的计算结果为 FALSE 而不是 TRUE 时,AND 操作可能与 OR 操作一样短路。
      猜你喜欢
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 2012-03-21
      • 1970-01-01
      • 2017-08-29
      • 2011-01-31
      • 1970-01-01
      • 2012-11-19
      相关资源
      最近更新 更多