我在同一SQL Server 2005实例上运行两个几乎相同的查询:
- 第一个是
SELECT
LINQ生成的原始查询(我知道,我知道...我不是应用程序开发人员,只是DBA :)。 - 第二个与第一个完全相同,最后添加一个
OPTION (RECOMPILE)
。
没有其他改变。
第一次运行需要55秒。
第二个需要2秒。
两个结果集是相同的。
为什么这个提示会带来如此惊人的性能提升?
的在线丛书条目RECOMPILE
未提供详细的解释:
指示SQL Server数据库引擎在执行后放弃为查询生成的计划,从而迫使查询优化器在下次执行同一查询时重新编译查询计划。在不指定RECOMPILE的情况下,数据库引擎缓存查询计划并重新使用它们。编译查询计划时,RECOMPILE查询提示将使用查询中任何局部变量的当前值;如果查询在存储过程中,则将当前值传递给任何参数。
当只需要重新编译存储过程中的一部分查询而不是整个存储过程时,RECOMPILE是创建使用WITH RECOMPILE子句的存储过程的有用替代方法。有关更多信息,请参见重新编译存储过程。创建计划指南时,RECOMPILE也很有用。有关更多信息,请参见使用计划指南优化已部署应用程序中的查询。
由于我的查询有很多局部变量,因此我猜测当我使用OPTION (RECOMPILE)
查询提示时,SQL Server能够(严重)优化它。
我到处看的人都说OPTION (RECOMPILE)
应该避免。对此的解释通常是,使用此提示,SQL Server无法重用此执行计划,因此必须浪费时间每次重新编译它。
(但是)鉴于巨大的性能优势,我倾向于认为这次使用此查询提示将是一件好事。
我应该使用它吗?如果没有,是否有一种方法可以强制SQL Server在没有此提示且不更改应用程序的情况下使用更好的执行计划?