Sqlserver:sp_recompile的副作用

  在sqlserver中,有一个系统存储过程:sp_recompile,可以强制对访问recompile【存储过程、触发器、表、视图】进行访问的相关的sql语句进行重新编译执行计划!

 

  如果 object 是存储过程或触发器的名称,那么该存储过程或触发器将在下次运行时重新编译。如果 object 是表或视图的名称,那么所有引用该表或视图的存储过程都将在下次运行时重新编译。

 

  存储过程和触发器所用的查询只在编译时进行优化。对数据库进行了索引或其它会影响数据库统计的更改后,已编译的存储过程和触发器可能会失去效率。通过对作用于表上的存储过程和触发器进行重新编译,可以重新优化查询。  Microsoft® SQL Server™ 会在便利时自动对存储过程和触发器进行重新编译。

 

  但该语句并不总是带来正面的作用,有时会使得执行计划变得更糟。原因进一步探究中..........???????

 

<<<<<<<<<<<<<<附录>>>>>>>>>>>>>>>>

执行计划的高速缓存和重新使用

Microsoft® SQL Server™ 2000 有用于存储执行计划和数据缓冲区的内存池。池内分配给执行计划或数据缓冲区的百分比随系统状态动态波动。内存池中用于存储执行计划的部分称为过程高速缓存。

SQL Server 2000 执行计划包含下面两个主要组件:

  • 查询计划

    执行计划的主体是一个重入的只读数据结构,可由任意数量的用户使用。这称为查询计划。查询计划中不存储用户环境。查询计划在内存中永远不会有一个或两个以上的复本:一个复本用于所有串行执行,一个复本用于所有并行执行。并行复本覆盖所有的并行执行,与并行执行的并行度无关。

  • 执行环境

    每个正在执行查询的用户都有一个包含其执行专用数据(如参数值)的数据结构。该数据结构称为执行环境。执行环境数据结构可以重新使用。如果用户执行查询而其中的一个结构未使用,将会用新用户的环境重新初始化该结构。

在 SQL Server 2000 中执行任何 SQL 语句时,关系引擎将首先查看过程高速缓存中是否有用于同一 SQL 语句的现有执行计划。SQL Server 2000 重新使用所找到的任何现有计划以节省重新编译 SQL 语句的开销。如果没有现有执行计划,则 SQL Server 2000 将为查询生成新的执行计划。

SQL Server 2000 有一个高效的算法,可查找用于任何特定 SQL 语句的现有执行计划。在大多数系统中,这种扫描所使用的最小资源比通过重新使用现有计划而不是编译每个 SQL 语句所节省的资源要少。

该算法将新的 SQL 语句与高速缓存内现有的未用执行计划相匹配,并要求所有的对象引用完全合法。例如,这两个 SELECT 语句中的第一个语句与现有计划不匹配,而第二个语句则匹配:

SELECT * FROM Employees
SELECT * FROM Northwind.dbo.Employees
执行计划的老化

执行计划生成后便驻留在过程高速缓存中。只有当需要空间时,SQL Server 2000 才使旧的未用计划从高速缓存老化掉。每个查询计划和执行环境都有相关的成本因子,可表明编译结构所需的费用。这些数据结构还有一个年龄字段。对象每由连接引用一次,其年龄字段便按编译成本因子递增。例如,如果一个查询计划的成本因子是 8 且被引用了两次,它的年龄将变为 16。惰性写入器进程定期扫描过程高速缓存内的对象列表。惰性写入器减少每个对象的年龄字段,每扫描一次减少 1。在本例中,查询计划的年龄经过 16 次过程高速缓存扫描后减为 0,除非其他用户引用了该计划。如果满足下面三个条件,惰性写入器进程将释放对象:

  • 内存管理器需要内存且所有可用内存都正在使用。
  • 对象的年龄字段是 0。
  • 对象在当前没有被连接引用。

因为每次引用对象时其年龄字段都会增加,所以经常被引用的对象的年龄字段不会减为 0,也不会从高速缓存老化掉。不经常被引用的对象将很快满足释放条件,但是不会真被释放,除非其它对象有内存需求。

重新编译执行计划

由于数据库的新状态,数据库内的某些更改可能会导致执行计划效率低下或不再有效。SQL Server 检测这些使执行计划无效的更改,并将计划标记为无效。此后,必须为执行查询的下一个连接重新编译新的计划。导致计划无效的情况包括:

  • 对查询所引用的表或视图进行任何结构更改(ALTER TABLE 和 ALTER VIEW)。
  • 通过语句(如 UPDATE STATISTICS)显式生成或者自动生成新的分发内容统计。
  • 除去执行计划所使用的索引。
  • 显式调用 sp_recompile
  • 对键的大量更改(其他用户对由查询引用的表使用 INSERT 或 DELETE 语句所产生的修改)。
  • 对于带触发器的表,inserteddeleted 表内的行数显著增长。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值