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

Sau*_*mar 7 sql sql-server optimization

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

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

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

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

Pan*_*wal 5

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

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

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

  • 但对于OP,避免使用此选项意味着每次执行查询时SQL Server花费的时间会延长100-200倍,并且可能会浪费大量的CPU和磁盘吞吐量,因为它总是使用错误的查询计划.除非有办法弄清楚如何让SQL Server缓存一个好的计划,否则'OPTION(RECOMPILE)`会更好,因为计划生成/优化时间与糟糕计划的执行时间相比是微观的... (4认同)

Mit*_*eat 5

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

更新统计信息:

EXEC sp_updatestats
Run Code Online (Sandbox Code Playgroud)

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

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