重新编译长时间运行的查询是一个好习惯

时间:2017-08-24 12:16:02

标签: sql-server tsql

我有一些长时间运行(几个小时)的存储过程,其中包含查询到分布式环境中包含数百万条记录的表。这些存储过程采用日期参数,并根据该日期参数过滤这些表。

我一直在想,由于SQL Server的参数嗅探功能,在第一次调用我的存储过程时,查询执行计划将根据该特定日期进行缓存,以后任何调用都将使用计划。我认为,由于创建执行计划只需几秒钟,为什么我不会在长时间运行的查询中使用RECOMPILE选项,对吧?我有什么缺点吗?

1 个答案:

答案 0 :(得分:2)

如果查询应该在您可接受的性能限制内运行,并且您怀疑参数嗅探是原因,我建议您在查询中添加重新编译提示..

此外,如果查询是存储过程的一部分,而不是重新编译整个过程,您还可以执行语句级重新编译,如

create proc  procname
(
@a int
)
as
select * from table where a=@a
option(recompile)

--no recompile here
select * from table t1
join
t2 on t1.id=t2.id
end

另外要提醒一下,重新编译查询会花费你。但引用Paul White

  

每次执行都要为计划编制付出代价,但改进的计划质量通常会多次回报这个成本。

2016年的查询商店可以帮助您跟踪此问题,并随着时间的推移存储查询计划。您将能够看到哪些表现更差..

如果你不是在2016年,威廉·杜尔金已经为版本(2008-2014)开发了open query store,其版本大致相同,可以帮助您解决问题

进一步阅读:
Parameter Sniffing, Embedding, and the RECOMPILE Options