首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >性能调优

性能调优
EN

Database Administration用户
提问于 2019-08-24 21:39:26
回答 1查看 44关注 0票数 0

我需要输入下面的查询,从性能的角度来看,哪个查询更好。

Query#1:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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);
EN

回答 1

Database Administration用户

发布于 2019-08-24 21:52:10

简单地说,两者都是同样糟糕的。谁都不是SARGable。将列封装在函数中,或应用可选参数会损害性能,防止索引的有效使用等。

第二个查询的优点是可以应用重新编译提示来解决一些性能问题:

代码语言:javascript
复制
SELECT Col1, Col2, ... 
FROM dbo.Table1 
WHERE (@Var1 IS NULL OR Col1 = @Var1)
OPTION(RECOMPILE);

但是,如果实际的查询更复杂,并且有更大的执行计划,或者如果它执行频繁(每分钟思考数百次或数千次),则可能会引入计划创建的开销。

典型的解决方案是使用动态SQL:

代码语言:javascript
复制
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注入安全编写的。

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/246193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档