相同的查询在SP中具有不同的执行计划

当完全相同的查询放入存储过程中时,它会生成一个完全不同的执行计划,大约需要18秒。

与我单独运行(并且只是DECLARE查询上方的变量)相比,运行速度大幅提高〜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上的全文索引的索引。

有什么想法吗?


即使查询看起来完全相同,局部变量和参数也完全不同。 对于局部变量,SQL Server根据统计平均密度值估算行数,因为实际值在编译时未知。 但是,在参数情况下,实际参数值将被“嗅探”,并根据统计直方图收集所提供实际值的估计值。 如果估计的行数显着不同,则生成的执行计划可能会有所不同。

您提到的症状可能表明统计数据过时或参数嗅探问题提到。 尝试使用FULLSCAN更新表上的统计信息并重新运行参数化查询以查看该计划是否更好:

UPDATE STATISTICS ON dbo.Books WITH FULLSCAN;
UPDATE STATISTICS ON dbo.BookPublishRegions WITH FULLSCAN;
链接地址: http://www.djcxy.com/p/62247.html

上一篇: Same query has different execution plan in SP

下一篇: Calculate the execution time of a method