所以我们有一个相当大的数据库和一个搜索大量文档的存储过程。根据上下文,它要么获取数百万个文档,要么只获取一百个。
重点是,对于百万和一百个文件,该过程需要 30 秒,这是超现实的。如果我在五个查询的每个 之后添加 OPTION (RECOMPILE)
,100 个文档需要 1 秒,数百万文档需要 30 秒(预计)。
我尝试使用 WITH RECOMPILE
选项创建一个过程,但它似乎没有重新编译其中的查询。
这样对吗?存储过程上的 WITH RECOMPILE
是重新编译内部查询还是仅重新编译整个 SP 的执行计划?如何在每次查询后不重复 OPTION (RECOMPILE)
的情况下执行此操作?
最佳答案
内部查询或只是执行计划,我不确定这是什么意思?使用 Stored proc 级别的重新编译,每次执行 proc 时都会导致重新编译并且查询不会保存到缓存中
create proc usp_test
with Recompile
as
Begin
--code
End
更多细节:
每次运行时,
With Recompile
都会为整个存储过程重新编译一个新计划。假设,你有以下 proc
create proc usp_test
as
Begin
select * from t1
go
select * from t2
End
在存储过程之上添加重新编译,将导致 SQLServer 重新编译存储过程中的所有批次
而不是重新编译,总的过程,如果你确定知道哪个批次导致问题,你可以像下面一样添加 Option(Recompile)
create proc usp_test
as
Begin
select * from t1 option(recompile)
select * from t2
End
这样做,您可以避免对其他批次进行不必要的重新编译