首页 > 解决方案 > 在 WHERE 子句中使用短路会提高速度吗

问题描述

用例:我将使用 SQL Server 从一个大表(1,000,000+ 行)中检索值,其中许多不同的列可以用作过滤条件,其中一些列比其他列更常用。

问题

  1. WHERE在子句中使用短路以减少比较会更快吗?

  2. 是否应该首先过滤最常用的标准以进行更少的比较?

  3. 是否应该为最常用的标准编制索引?

例子

SELECT value
FROM AssignmentTable
WHERE (criteriaOne = <criteriaOneValue> OR criteriaOne IS NULL)
  AND (criteriaTwo = <criteriaTwoValue> OR criteriaTwo IS NULL)
  AND (criteriaThree = <criteriaThreeValue> OR criteriaThree IS NULL)
  AND ... for all criteria (roughly 15)
SELECT value
FROM AssignmentTable
WHERE 1 = 
  CASE
    WHEN (criteriaOne = <criteriaOneValue> OR criteriaOne IS NULL) THEN
      CASE
        WHEN (criteriaTwo = <criteriaTwoValue> OR criteriaTwo IS NULL) THEN
          CASE
            WHEN (criteriaThree = <criteriaThreeValue> OR criteriaThree IS NULL) THEN 1
            ELSE 0
          END
        ELSE 0
      END
    ELSE 0
  END

标签: sqlsql-servershort-circuiting

解决方案


在 SQL Server 中不使用动态 SQL 的模式是使用 OPTION (RECOMPILE) 在查询优化器生成查询计划之前修剪不需要的谓词。

例如:

SELECT value
FROM AssignmentTable
WHERE (Column1 = @column1 OR @column1 IS NULL)
  AND (Column2 = @column2 OR @column2 IS NULL)
  AND (Column3 = @column3 OR @column3 IS NULL)
  AND ... for all criteria (roughly 15)
OPTION (RECOMPILE)

有关备选方案的完整讨论,请参阅T-SQL中的经典动态搜索条件。


推荐阅读