所以我们有一个庞大的数据库和一个搜索大量文档的存储过程。根据上下文,它可以获取数百万个文档,也可以只获取一百个文档。
重点是,对于数百万和数百个文件来说,这个过程需要30秒才是超现实的。如果我在五个查询的每个之后添加OPTION (RECOMPILE)
,那么100个文档需要一秒钟,而数百万个文档需要30秒。
我尝试使用WITH RECOMPILE
选项创建一个过程,但它似乎没有重新编译查询。
这是对的吗?存储过程的WITH RECOMPILE
是否重新编译内部查询或仅重新编译整个SP的执行计划?如何在每次查询后不重复OPTION (RECOMPILE)
的情况下执行此操作?
答案 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)。