hoa*_*key 1 sql sql-server-2008
我有一个查询,其中有一个使用许多局部变量构建的where子句,但这很慢.下面是一个粗略的例子,因为我目前无法访问查询:
declare @a varchar(50), @b varchar(50), @c varchar(50)
set @a = '%'
set @b = 'foo'
set @c = '%bar'
Run Code Online (Sandbox Code Playgroud)
我的where子句是什么样的
where a = @a and b = @b and c =@c
Run Code Online (Sandbox Code Playgroud)
这需要大约1分钟才能运行.但是,如果我直接引用where子句中的值,例如:
where a = '%' and b = 'foo' and '%bar'
Run Code Online (Sandbox Code Playgroud)
大约需要5秒钟.
所以我的问题是,有没有更好的方法来构建我的where子句?需要注意的一件重要事情.where子句中使用了大约10个局部变量,但大多数都设置为默认值%
提前致谢
小智 6
在WHERE过滤器中使用局部变量会导致FULL TABLE SCAN.因为SS在编译时不知道局部变量的值.因此,它创建了一个可用于该列的最大规模的执行计划.
为了防止性能问题,SS必须在编译时知道变量的值.定义SP,并将这些局部变量作为参数传递是问题的解决方案之一.另一个解决方案是,使用sp_executesql并再次将这些局部变量作为参数传递...
或者,您可以在sql语句的末尾添加OPTION(RECOMPILE),以便编译本地变量.这将解决性能问题.
| 归档时间: |
|
| 查看次数: |
3807 次 |
| 最近记录: |