因此,我们有一个相当大的数据库和一个存储过程,可以搜索大量的文档。根据上下文的不同,它要么获取数百万个文档,要么只获取100个文档。
关键是,数百万份文件需要30秒的时间,这是超现实的。如果我在五个查询的每个OPTION (RECOMPILE)之后添加,则100个文档需要1秒,数百万个文档(预期)需要30秒。
我尝试过用WITH RECOMPILE选项创建一个过程,但它似乎没有在其中重新编译查询。
这是正确的吗?存储过程上的WITH RECOMPILE是重新编译内部查询还是只编译整个SP的执行计划?在每次查询之后,我如何不重复OPTION (RECOMPILE),就能做到这一点?
发布于 2016-12-13 14:54:07
WITH对存储过程的重新编译是重新编译内部查询还是只编译整个SP的执行计划?
内部查询或只是执行计划,我不知道这意味着什么?在存储的proc级别重新编译时,每次执行proc并没有将查询保存到Cache时,都会导致重新编译。
在每次查询之后,我如何在不重复选项(重新编译)的情况下做到这一点?
create proc usp_test
with Recompile
as
Begin
--code
End更多细节:
With Recompile将为整个存储的proc重新编译一个新计划,每次运行它。
假设,下面是proc
create proc usp_test
as
Begin
select * from t1
go
select * from t2
End在存储的proc之上添加重新编译,将导致SQLServer重新编译存储proc中的所有批。
如果您确实知道哪一批正在导致问题,而不是重新编译,那么您可以添加选项(重新编译),如下所示
create proc usp_test
as
Begin
select * from t1 option(recompile)
select * from t2
End这样做,可以避免不必要地重新编译其他批处理。
发布于 2016-12-13 15:36:37
两个选项(重新编译)和使用重新编译都将根据每次使用的参数给出执行计划,但只有选项(重新编译)允许“参数嵌入优化”,其中参数在解析查询时被替换为文字常量。这允许优化器对查询进行简化。
我会找出实际导致性能问题的查询,并在此上使用选项(重新编译)。
https://stackoverflow.com/questions/41123944
复制相似问题