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 个注释变量。
我在 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 个注释变量。