sql - 在 WHERE 子句中使用短路会提高速度吗
问题描述
用例:我将使用 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
解决方案
在 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中的经典动态搜索条件。
推荐阅读
- android - Cordova - 由于联系权限,Android 应用程序在启动时崩溃
- sql - SSRS关于参数中的多个值的问题
- android - 删除谷歌地图中的所有折线
- html - URL linking to collapsible element's child link?
- python - How to change colorbar using Matplotlib?
- asp.net - How to successfully query a database for 0 applicants using LINQ
- wordpress - Wordpress 动态图像滑块插件
- c++ - 在相应的源文件中使用头文件中的别名
- angular - 在 AGM 地图之前加载 googlemaps api
- html - CSS无法保持div的纵横比(填充顶部不起作用)