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

重点是,对于百万和一百个文件,该过程需要 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

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

10-06 12:35