关于重新编译存储过程的问题

guguda2008 2009-08-29 10:22:30
我们知道,SQLServer会缓存查询计划,假如有这么一个存储过程:

create proc myproc

(

@pno int

)

as

select * from charge where provider_no = @pno

第一次我们传进来一个21,OK,它会缓存该存储过程的执行计划为nonclustered index seek那个。后来我们又传进来一个500,完蛋了,服务器发现它有一个myproc的缓存,so,又通过nonclustered index seek执行,接着你的同伙看到你的查询花费了巨量的IO,于是,你被鄙视了。

这说明了啥?说明如果你的查询选择性变动剧烈,你应该告诉SQLServer不要缓存查询计划,每次都应该重新评估、编译。实现方法很简单,查询的尾巴上加一个option(recompile)好了。而且SQL2k5还有一个nb的feature,可以每次只重新编译存储过程的一部分(当然,你也可以选择重新编译整个存储过程,这取决于你的需求。详见联机文档。)
---------------------------------------------------------------------------------------------------------
读完这段让我感觉很郁闷,连那么简单的SQL都应该重新编译那还有什么SELECT不需要重新编译呢?
大大们给讲一下重新编译存储过程的问题吧,什么时候应该注意重新编译,哪些语句用哪些不用?


再从联机从书COPY一段:
SQL Server 中,强制重新编译存储过程的方式有三种:

sp_recompile 系统存储过程强制在下次执行存储过程时对其重新编译。


创建存储过程时在其定义中指定 WITH RECOMPILE 选项,指明 SQL Server 将不为该存储过程缓存计划,在每次执行该存储过程时对其重新编译。当存储过程的参数值在各次执行间都有较大差异,导致每次均需创建不同的执行计划时,可使用 WITH RECOMPILE 选项。此选项并不常用,因为每次执行存储过程时都必须对其重新编译,这样会导致存储过程的执行变慢。

如果只想在要重新编译的存储过程而不是整个存储过程中执行单个查询,请在要重新编译的每个查询中指定 RECOMPILE 查询提示。此行为类似于前文所述的 SQL Server 语句级重新编译行为,但除了使用存储过程的当前参数值外,RECOMPILE 查询提示还在编译语句时使用存储过程中本地变量的值。请仅在属于存储过程的查询子集中使用非典型值或临时值时使用此选项。有关详细信息,请参阅查询提示 (Transact-SQL)。


可以通过指定 WITH RECOMPILE 选项,强制在执行存储过程时对其重新编译。仅当所提供的参数是非典型参数,或自创建该存储过程后数据发生显著变化时,才应使用此选项。
...全文
198 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
SQL77 2009-08-31
  • 打赏
  • 举报
回复
学习宝鸭
guguda2008 2009-08-31
  • 打赏
  • 举报
回复
顶起等大大们解释
华夏小卒 2009-08-29
  • 打赏
  • 举报
回复
接分
htl258_Tony 2009-08-29
  • 打赏
  • 举报
回复
BD
guguda2008 2009-08-29
  • 打赏
  • 举报
回复
怎么沉了。。。。。

大大们给讲一下重新编译存储过程的问题吧,什么时候应该注意重新编译,哪些语句用哪些不用?
黄_瓜 2009-08-29
  • 打赏
  • 举报
回复
学习
--小F-- 2009-08-29
  • 打赏
  • 举报
回复
学习
liangCK 2009-08-29
  • 打赏
  • 举报
回复
....
victorcai2006 2009-08-29
  • 打赏
  • 举报
回复
学习一下,MARK
feixianxxx 2009-08-29
  • 打赏
  • 举报
回复
jf

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧