用例:我将使用SQL Server从大型表(1,000,000+行)中检索值,在该表中许多不同的列可用作筛选条件,其中某些列比其他列更常用。
问题
在WHERE
子句中使用短路会更快,以便进行较少的比较吗?
是否应该首先过滤最常用的标准以进行更少的比较?
最常用的标准应该被索引吗?
示例
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
在WHERE子句中利用短路会更快,以便进行较少的比较吗?
没有SQL未定义评估顺序。
是否应该首先过滤最常用的标准以进行更少的比较?
这绝对是零效果。
应该索引最常用的标准吗?
是。但是,请始终查看您的执行计划,而不是简单地假设使用了哪些列或条件。