SQL where 子句中使用的服务器查询性能视图

SQL Server Query performance view used in where clause

我在 sql 服务器中的查询有问题。

我在 where 子句中使用了一个视图

SELECT ... 
FROM T1
WHERE 
(@param = 1 AND EXISTS (SELECT 1 FROM VIEW...)) // in this case => use view
OR
(@param = 2 AND T1.Id = ...) // in this case => no view

我在执行计划中看到始终构建视图。但我不想那样。

有什么想法吗?

将参数值检查移到 sub-query 中,然后查询优化器应该能够构建更好的计划:

SELECT ... 
FROM T1
WHERE 
(EXISTS (SELECT 1 FROM VIEW ... WHERE ... @param = 1)) // in this case => use view
OR
(@param = 2 AND T1.Id = ...) // in this case => no view

如果您不希望在不需要时构建视图,请使用动态 SQL 并在需要或不需要时有条件地启用和禁用视图部分。类似的东西:

declare @useView nvarchar(max) = '--'

if (@param = 1)
set @useView = ''

declare @sql nvarchar(max) = '
SELECT ... 
 FROM T1
 WHERE 1=1 '
 + @useView ' AND EXISTS (SELECT 1 FROM VIEW...)) -- in this case => use view '
+'
 AND
 (@p_param = 2 AND T1.Id = ...) -- in this case => no view '

print @sql
exec sp_executesql @sql,N'@p_param INT',@p_param = @param

您需要确保引用 VIEW 的整个 SELECT 适合由 -- 注释覆盖的 1 行,否则为 /**/ 使用 2 个注释变量。