我需要输入下面的查询,从性能的角度来看,哪个查询更好。
Query#1:
DECLARE @Var1 NVARCHAR(15) = NULL; -- This variable can have NULL or specific value
SELECT Col1, Col2, ... FROM dbo.Table1 WHERE Col1 = ISNULL(@Var1, Col1);Query#2:
DECLARE @Var1 NVARCHAR(15) = NULL; -- This variable can have NULL or specific value
SELECT Col1, Col2, ... FROM dbo.Table1 WHERE (@Var1 IS NULL OR Col1 = @Var1);发布于 2019-08-24 21:52:10
简单地说,两者都是同样糟糕的。谁都不是SARGable。将列封装在函数中,或应用可选参数会损害性能,防止索引的有效使用等。
第二个查询的优点是可以应用重新编译提示来解决一些性能问题:
SELECT Col1, Col2, ...
FROM dbo.Table1
WHERE (@Var1 IS NULL OR Col1 = @Var1)
OPTION(RECOMPILE);但是,如果实际的查询更复杂,并且有更大的执行计划,或者如果它执行频繁(每分钟思考数百次或数千次),则可能会引入计划创建的开销。
典型的解决方案是使用动态SQL:
DECLARE @Var1 NVARCHAR(15) = NULL; -- This variable can have NULL or specific value
DECLARE @SQL NVARCHAR(MAX) = N''
SET @SQL = @SQL + N'SELECT Col1, Col2, ... FROM dbo.Table1 WHERE 1 = 1'
IF @Var1 IS NOT NULL
BEGIN
SET @SQL += ' AND Col1 = @iVar1'
END;
EXEC sys.sp_executesql @SQL, N'@iVar1 NVARCHAR(15)', @iVar1 = @Var1;这是为防止SQL注入安全编写的。
https://dba.stackexchange.com/questions/246193
复制相似问题