我有两个SQL查询,每个查询大约2-3个INNER JOINS。我需要在他们之间做一个INTERSECT。
问题在于,个人查询工作速度很快,但在交叉后总共花费大约4秒。
现在,如果我在整个查询的末尾放置一个OPTION(RECOMPILE),那么查询工作得非常好,几乎可以立即快速返回!。
我理解选项recopile会强制执行计划的重建,所以如果我的管理员查询需要4秒钟更好或者现在重新编译,但我现在很困惑,但是0秒更好。
答案 0 :(得分:5)
指定WITH RECOMPILE SQL Server不会缓存此存储过程的计划, 每次执行时都会重新编译存储过程。
每当第一次在SQL Server中运行存储过程时,它都会进行优化,并在SQL Server的内存中编译和缓存查询计划。每次在缓存后运行相同的存储过程时,它将使用相同的查询计划,从而无需在每次运行时优化和编译相同的存储过程。因此,如果您需要每天运行相同的存储过程1,000次,则可以节省大量时间和硬件资源,并且SQL Server不必像以前那样努力工作。
您不应该使用此选项,因为通过使用此选项,您将失去通过使用存储过程替换SQL查询所获得的大部分优势。
答案 1 :(得分:5)