sql - SQL Server Where 子句性能
问题描述
我有一个 SQL 查询,它在 where 子句中查看 10 多个条件。我不确定下面哪种方式在性能方面会更好。我的一些参数很重要,有些是次要的。
如果您能解释哪个更好以及为什么我将不胜感激。
我的参数
DECLARE @ParamImportant1 int, @ParamImportant2 int, @ParamImportant2 int,
@ParamSecondary1 int, @ParamSecondary2 int,@ParamSecondary3 int
第一种方法 我有一个包含所有参数的索引。
SELECT
*
FROM MyTable
WHERE Col1 = @ParamImportant1 AND Col2 = @ParamImportant2 AND Col3 = @ParamImportant3
AND (@ParamSecondary1 IS NULL OR ColSec1 = @ParamSecondary1)
AND (@ParamSecondary2 IS NULL OR ColSec2 = @ParamSecondary2)
AND (@ParamSecondary3 IS NULL OR ColSec3 = @ParamSecondary3)
第二种方法 使用子查询或cte划分查询。
SELECT
*
FROM
(
SELECT
*
FROM MyTable
WHERE Col1 = @ParamImportant1 AND Col2 = @ParamImportant2 AND Col3 = @ParamImportant3
) X
WHERE (@ParamSecondary1 IS NULL OR ColSec1 = @ParamSecondary1)
AND (@ParamSecondary2 IS NULL OR ColSec2 = @ParamSecondary2)
AND (@ParamSecondary3 IS NULL OR ColSec3 = @ParamSecondary3)
使用临时表的第三种方法
SELECT
*
INTO #MyTemp
FROM MyTable
WHERE Col1 = @ParamImportant1 AND Col2 = @ParamImportant2 AND Col3 = @ParamImportant3
SELECT
*
FROM #MyTemp
WHERE (@ParamSecondary1 IS NULL OR ColSec1 = @ParamSecondary1)
AND (@ParamSecondary2 IS NULL OR ColSec2 = @ParamSecondary2)
AND (@ParamSecondary3 IS NULL OR ColSec3 = @ParamSecondary3)
解决方案
避免参数中的“智能逻辑”,否则 MSSQL 无法找出获取数据的最佳方式。
获得最佳执行计划的最可靠方法是避免 SQL 语句中不必要的过滤器。
https://use-the-index-luke.com/sql/where-clause/obfuscation/smart-logic
推荐阅读
- ios - 使用相同的选择器选择文档和图库图像
- .net - 尝试运行 WebAPI 时,Visual Studio 显示“选择智能卡设备”窗口
- ruby-on-rails - 显示从数据库中获取的数据时是否应该调用 escape_javascript
- gremlin - Get all the values from connected nodes grouped by keys
- reactjs - 如何在 mobx 中订阅 @computed 对象?
- playframework - 使用 playframework 2.7.3 运行 sbt-proguard 时出现错误
- active-directory - 当用户在有多个域控制器的环境中更改他/她的密码时会发生什么
- java - Apache Ignite 频繁缓存关闭异常
- r - 将列表中的常见值与不相等的子列表元素进行比较
- reactjs - 如何更新对象数组中的一个对象?