【发布时间】:2015-01-24 17:46:24
【问题描述】:
当完全相同的查询放在存储过程中时,它会生成一个完全不同的执行计划,大约需要 18 秒。
与我单独运行时(并且只是在查询上方声明变量)相比,它的运行速度要快得多~ 1-2 秒。
我该怎么做才能使 SP 中的查询在单独运行时使用执行计划运行?仅供参考,我什至通过创建一个全新的存储过程并将查询复制粘贴到其中来重现该问题。大约 18 秒的相同结果。
查询如下图供参考
select
COUNT(b.BookKey) as RowCounter
from
Books b (nolock)
inner join BookPublishRegions bp (nolock)
on b.BookKey = bp.BookKey
where
b.IsUnavailable = 0 and
(@AuthorKey is null or b.AuthorKey = @AuthorKey) and
(b.Price between @MinPrice and @MaxPrice) and
contains(bp.PublishRegionName, @SearchTerm)
我有关于 b.IsUnavailable、b.AuthorKey、b.Price 的索引和关于 bp.PublishRegionName 的全文索引。
有什么想法吗?
【问题讨论】:
-
参数嗅探可能是一个原因。这可能对你有帮助stackoverflow.com/questions/27194253/…
-
感谢@GiorgosBetsos。我尝试了将 SearchTerm 声明为局部变量并设置为参数值的解决方案(根据该帖子中推荐的解决方案),但它仍然没有成功。还有什么想法吗?
-
更正上述评论。我为 AuthorKey 设置了另一个局部变量,现在它又快速运行了……这是否意味着我必须为存储过程中使用的所有参数设置新的局部变量??
-
要禁用参数嗅探,您需要为 where 子句中使用的每个输入变量声明一个局部变量
标签: sql asp.net .net sql-server performance