“使用重新编译”是否重新编译存储过程中的所有查询?

时间:2016-12-13 14:48:10

标签: sql sql-server stored-procedures

所以我们有一个庞大的数据库和一个搜索大量文档的存储过程。根据上下文,它可以获取数百万个文档,也可以只获取一百个文档。

重点是,对于数百万和数百个文件来说,这个过程需要30秒才是超现实的。如果我在五个查询的每个之后添加OPTION (RECOMPILE),那么100个文档需要一秒钟,而数百万个文档需要30秒。

我尝试使用WITH RECOMPILE选项创建一个过程,但它似乎没有重新编译查询。

这是对的吗?存储过程的WITH RECOMPILE是否重新编译内部查询或仅重新编译整个SP的执行计划?如何在每次查询后不重复OPTION (RECOMPILE)的情况下执行此操作?

2 个答案:

答案 0 :(得分:3)

  

存储过程中的WITH RECOMPILE是重新编译内部查询还是仅重新编译整个SP的执行计划?

内部查询或只是执行计划,我不确定这是什么意思?在存储过程级别重新编译时,每次执行proc并且查询未保存到Cache时将导致重新编译

  

如何在每次查询后不重复OPTION(RECOMPILE)的情况下执行此操作?

Set wb = ThisWorkbook
Set demandWB = Workbooks.Open("http INSERT URL Demand%20Plan%2016.xlsm")

更多细节:
每次运行时,create proc usp_test with Recompile as Begin --code End 都会重新编译整个存储过程的新计划..

假设你有下面的proc

With Recompile

在存储过程之上添加重新编译,将导致SQLServer重新编译存储过程中的所有批次

总进程,如果您确切知道哪个批次导致问题,而不是重新编译,您可以添加如下所示的选项(重新编译)

create proc usp_test
as
Begin
select * from t1
 go
select * from t2
End

这样做,可以避免不必要的重新编译其他批次

答案 1 :(得分:1)

OPTION(RECOMPILE)和WITH RECOMPILE都会根据每次使用的参数给出执行计划,但只有OPTION(RECOMPILE)允许"参数嵌入优化"在解析查询时,参数被文字常量替换。这可以允许优化器简化查询。

我会找出哪个查询实际导致性能问题并在其上使用OPTION(RECOMPILE)。