| 论坛登陆 注册 | 教程 笑话 影视 投稿 |
![]() |
|
||||||||||||||||||||||||||||||||||||||||
SQL Server 2005中的批编译、重新编译和计划缓存问题(2) |
|
| www.xker.com 作者: 来源:microsoft 加入日期:2006-3-8 8:59:11 | |
两种特殊情况 与计划最优性相关的重新编译在下列两种特殊情况中的处理方式有所不同。 特殊情况 1:在空表或索引视图上创建的统计SQL Server 2005 处理下列情况的方式不同于 SQL Server 2000。用户创建了一个空表 T。然后又在 T 一个或多个列上创建了一个统计 S。由于 T 为空,因此统计二进制大对象(直方图)为 NULL,但已经在 T 上创建了统计。假设在查询编译期间已发现 S 是“令人关注的”。根据重新编译阈值的“500 行”规则,只有至少包含 500 行,T 才会在 SQL Server 2000 上导致重新编译。所以,如果 T 包含的行不足 500,用户可能使用欠优化的计划。 SQL Server 2005 可检测到这种特殊情况,并以不同的方式进行处理。在 SQL Server 2005 中,这种表或索引视图的重新编译阈值为 1。换句话说,即使仅在 T 中插入一行,也可能导致重新编译。发生这种重新编译时,S 将被更新,同时 S 的直方图不再为 NULL。然而,这一重新编译附带了重新编译阈值 (500 + 0.20 * n)的一般规则。 在 SQL Server 2005 中,即使发生下列情况,重新编译阈值始终为 1:(1) T 没有统计;或者 (2) T 没有在查询编译期间被认作是“令人关注的”统计。 特殊情况 2:触发器重新编译导致重新编译的与计划最优性相关的所有原因都适用于触发器。另外,由于已插入或已删除的表中的行数在不同的触发器执行间发生巨大变化,也会对触发器产生与计划最优性相关的重新编译。 回想一下,影响一行或多行的触发器会被单独缓存。已插入和已删除的表中的行数通过触发器的查询计划进行保存。这些数字反映了导致计划缓存的触发器执行的行数。如果后续的触发器执行产生了拥有“截然不同的”行数的已插入或已删除的表,那么将对该触发器进行重新编译(并缓存带有新行数的全新的查询计划)。 在 SQL Server 2005 中,“截然不同”的定义如下: | log10(n) – log10(m) | > 1 if m > n | log10(n) – log10(m) | > 2.1 otherwise 其中 n 是已缓存查询计划中的已插入或已删除表的行数,而 m 是当前的触发器执行的对应表的行数。如果同时存在“已插入”和“已删除”的表,将对两者分别执行上面提到的测试。 举一个计算示例,从 10 到 100 的行数更改不会导致重新编译,而从 10 到 101 的更改则完全相反。 在 SQL Server 2000 中,“截然不同”的定义如下: | log10(n+5) – log10(m+5) | >= 1 其中 n 和 m 的定义同上。请注意,根据这个公式,在 SQL Server 2000 中将已插入或已删除的表的基数从 5 改为 95,将导致重新编译,而从 5 到 94 的更改则不然。 识别与统计相关的重新编译可通过包含字符串“Statistics changed”的事件探查器跟踪(将在本文后面介绍)的“EventSubClass”列来识别与统计相关的重新编译。 结束语与本文档的主题没有直接相关的一个问题是:给定的多个统计以相同的顺序存在于一组相同的列中,那么在查询优化期间,查询优化器如何决定所要载入的统计呢?答案并不那么简单,但查询优化器采用如下原则:为最近的统计提供比较旧的统计更高的优先权;为使用 FULLSCAN 选项计算得出的统计提供比用样例计算得出的统计更高的优先权;等等。 编辑:xker.com上一篇:SQL Server 2005 中的Multiple Active Result Set (MARS) 下一篇:SQL Server 2005中的批编译、重新编译和计划缓存问题(1) |
||
| 【关闭窗口】【技术交流】【收藏此页】 |
| 相关文章 | ||
|
| 评论 | |
设为首页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接 |
|
| Copyright © 2003-2006 xker.com All rights reserved.小新技术网 合作广告QQ:12231446 | |
|
|
| 本页浏览次数: |