选项重新编译使查询快速 - 好还是坏?

时间:2010-11-25 09:05:47

标签: sql sql-server optimization

我有两个SQL查询,每个查询大约2-3个INNER JOINS。我需要在他们之间做一个INTERSECT。

问题在于,个人查询工作速度很快,但在交叉后总共花费大约4秒。

现在,如果我在整个查询的末尾放置一个OPTION(RECOMPILE),那么查询工作得非常好,几乎可以立即快速返回!。

我理解选项recopile会强制执行计划的重建,所以如果我的管理员查询需要4秒钟更好或者现在重新编译,但我现在很困惑,但是0秒更好。

2 个答案:

答案 0 :(得分:5)

指定WITH RECOMPILE SQL Server不会缓存此存储过程的计划, 每次执行时都会重新编译存储过程。

每当第一次在SQL Server中运行存储过程时,它都会进行优化,并在SQL Server的内存中编译和缓存查询计划。每次在缓存后运行相同的存储过程时,它将使用相同的查询计划,从而无需在每次运行时优化和编译相同的存储过程。因此,如果您需要每天运行相同的存储过程1,000次,则可以节省大量时间和硬件资源,并且SQL Server不必像以前那样努力工作。

您不应该使用此选项,因为通过使用此选项,您将失去通过使用存储过程替换SQL查询所获得的大部分优势。

答案 1 :(得分:5)

而不是回答你问的问题,这是你应该做的:

更新统计信息:

EXEC sp_updatestats

如果不起作用,请重建索引。

如果不起作用,请查看OPTIMIZE FOR