代码之家  ›  专栏  ›  技术社区  ›  Steve Wortham

SQL中哪个条件语句更快?

  •  1
  • Steve Wortham  · 技术社区  · 16 年前
    SELECT a, b FROM products WHERE (a = 1 OR b = 2)
    

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

    这两种说法应取得相同的结果。然而,第二种方法避免了SQL中臭名昭著的慢“或”操作数。这是否使第二个陈述更快?

    5 回复  |  直到 16 年前
        1
  •  4
  •   ConcernedOfTunbridgeWells    16 年前

    传统上,后者对于乐观主义者来说更容易处理,因为它可以轻松解决问题 and s-arg ,它(粗略地说)是一个可以使用索引解析的谓词。

    OR 对s-args的语句和使用OR谓词的查询无法有效使用索引。因此,建议避免使用它,并用后一个示例中的术语重新转换查询。最近的乐观主义者更善于识别符合此转换的OR语句,但复杂的OR语句可能仍会混淆它们,导致不必要的表扫描。

    这就是“或慢”模因的起源。性能与处理表达式的效率无关,而是与优化者识别利用索引机会的能力有关。

        2
  •  1
  •   JoshJordan    16 年前

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

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

        3
  •  1
  •   Steve Kass    16 年前

        4
  •  1
  •   A-K    16 年前

    SQL Server会在优化之前重写所有查询,并且很可能在重写后两个查询都相同。

    同时运行以下命令:

    SET STATISTICS IO ON;
    SET STATISTICS TIME ON;
    

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

        5
  •  0
  •   Akash Kava    16 年前

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

    然而,若a或b中的一个被索引,查询执行计划可能会有所不同,因为索引列比较涉及对单个比较结果集的相交和并集连接操作!!

    此外,如果考虑在多个表上加入复杂查询的时间或可能是这个问题中的其他贡献者所提到的大问题,那么考虑或慢运算符是错误的。但对于较小的查询,还是应该可以的。事实上,每个查询都有自己的挑战,它不仅取决于帮助文件中记录的内容,还取决于数据的分布方式、重复性和差异因素。