将在WHERE子句中使用短路以提高速度

问题描述 投票:0回答:1

用例:我将使用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
sql sql-server short-circuiting
1个回答
0
投票

在WHERE子句中利用短路会更快,以便进行较少的比较吗?

没有SQL未定义评估顺序。

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

这绝对是零效果。

应该索引最常用的标准吗?

是。但是,请始终查看您的执行计划,而不是简单地假设使用了哪些列或条件。

© www.soinside.com 2019 - 2024. All rights reserved.