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