SqlServer2008实例53重新编译和缓存

本文介绍了SQL Server 2008中存储过程的重新编译情况,包括自动和手动触发的重新编译。自动重新编译发生在存储过程依赖的对象发生变化时,而强制重新编译可以通过WITH RECOMPILE选项实现,以应对不同输入参数导致的性能问题。同时,文章提到了清空过程缓存的DBCC FREEPROCCACHE命令,主要用于测试存储过程性能,但在生产环境中应谨慎使用。
摘要由CSDN通过智能技术生成

1.每次存储过程执行时重新编译

    当存储过程的计划自动或显式重建的时候就会发生重新编译。当存储过程中引用的基础表或其他对象发生改变后,存储过程就会在其执行期间自动重新编译。计划使用的索引发生变动或者存储过程引用的表键发生了大量的更新也可能引起重新编译。自动重新编译的目的足确保SQL Servcr执行计划使用最新的信息,不使用过期的假设架构和数据。
    SQL Server在存储过程中使用语句级别的重新编译,而不是重新编译整个存储过程。重新编译在生成新计划的时候会引起额外的负载,而语句级别的重新编译能减小这种负载,因为它只纠正需要纠正的地方。
  尽管重新编译代价很高,并且应该在大多数时候避免,但是有时候你的存储过程还是有需要强制重新编译的理由。例如,由于限定列不同的选择性,存储过程可能基于调用它的应用程序生成差异很大的查询结果——以至于保留的执行计划在使用不同的输入参数时会引起性能问题。
    例如,如果一个参数指定的城市返回一百万行,而另外一个城市值返回一行,SQL Server可能就没必要缓存正确的执行计划了。可能最终缓存的计划是为一行优化的而不是一百万行,这样会引起很长的查询执行时间。如果你觉得除了缓存之外存储过程还在其他地方有用,就可以使用WITH RECOMPILE命令。
    示例:强制存储过程在每次执行的时候重新编译:

USE AdventureWorks
GO

CREATE PROC dbo.usp_SEL_BackupMBsPerSecond
(@BackupStarDate datetime,
@BackupFinishDate datetime)
WITH RECOMPILE --从不保存计划
AS

--衡量db备份吞吐量
SELECT (SUM(backup_size)/1024)/1024 as 'MB',
        DATEDIFF(SS,MIN(backup_s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ngbshzhn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值