首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“使用重新编译”是否重新编译存储过程中的所有查询?

“使用重新编译”是否重新编译存储过程中的所有查询?
EN

Stack Overflow用户
提问于 2016-12-13 14:48:10
回答 2查看 28.5K关注 0票数 6

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

关键是,数百万份文件需要30秒的时间,这是超现实的。如果我在五个查询的每个OPTION (RECOMPILE)之后添加,则100个文档需要1秒,数百万个文档(预期)需要30秒。

我尝试过用WITH RECOMPILE选项创建一个过程,但它似乎没有在其中重新编译查询。

这是正确的吗?存储过程上的WITH RECOMPILE是重新编译内部查询还是只编译整个SP的执行计划?在每次查询之后,我如何不重复OPTION (RECOMPILE),就能做到这一点?

EN

回答 2

Stack Overflow用户

发布于 2016-12-13 14:54:07

WITH对存储过程的重新编译是重新编译内部查询还是只编译整个SP的执行计划?

内部查询或只是执行计划,我不知道这意味着什么?在存储的proc级别重新编译时,每次执行proc并没有将查询保存到Cache时,都会导致重新编译。

在每次查询之后,我如何在不重复选项(重新编译)的情况下做到这一点?

代码语言:javascript
复制
create proc usp_test
with Recompile 
as
Begin
--code
End

更多细节:

With Recompile将为整个存储的proc重新编译一个新计划,每次运行它。

假设,下面是proc

代码语言:javascript
复制
create proc usp_test
as
Begin
select * from t1
 go
select * from t2
End

在存储的proc之上添加重新编译,将导致SQLServer重新编译存储proc中的所有批。

如果您确实知道哪一批正在导致问题,而不是重新编译,那么您可以添加选项(重新编译),如下所示

代码语言:javascript
复制
 create proc usp_test
    as

    Begin

    select * from t1 option(recompile)

    select * from t2

    End

这样做,可以避免不必要地重新编译其他批处理。

票数 7
EN

Stack Overflow用户

发布于 2016-12-13 15:36:37

两个选项(重新编译)和使用重新编译都将根据每次使用的参数给出执行计划,但只有选项(重新编译)允许“参数嵌入优化”,其中参数在解析查询时被替换为文字常量。这允许优化器对查询进行简化。

我会找出实际导致性能问题的查询,并在此上使用选项(重新编译)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41123944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档