快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

和记娱乐在线官网:《Microsoft Sql server 2008 Internals》读书笔记第九章Plan Caching and Recompilation(5)



上文我们懂得编译工具和重编译的原由之一:Correctness-Based Recompiles(基于更正的重编译),现在我们继承懂得重编译的另一个原由:Optimality-based Recompiles(基于优化的重编译)

■Optimality-based Recompiles (基于优化的重编译)

假如SQL Server有来由猜证已经存在的计划已经不再优化,也可能选择重编译一个计划。猜证一个非优化的计划的重要缘故原由是敷衍根基数据(underlying data)的变更。假如天生查询计划的任何一个统计量自计划被创建时被更新,或者任何一个统计量被觉得是Stale(过时的),SQL Server从新编译查询计划。

1、已更新的统计量

统计量可妙手动或自动被更新。手动更新在有人运行sp_updatestats或update statitics敕令时发生。自动更新在SQL Server抉择已经存在的统计量是逾期的(out of date)或过时的(stale)。但这些更新只有在数据库选项AUTO_UPDATE_STATISTICS或 AUTO_UPDATE_STATISTICS_ASYNC为ON时才发生。假如另一个批处置惩罚试图应用当前计划的表或视图,SQL Server侦察到统计已颠末期,于是初始化UPDATE STATISTICS操作。

2、过时的统计量

SQL Server在第一次编译(在缓存中没有查询计划的)批处置惩罚时侦察过时的统计量,也侦察在已有计划的过时统计量。下图展示了查找一个已存在的计划并反省是否必要重编译时调用步骤的流程图:

假如数据库的AUTO_UPDATE_STATISTICS_ASYNC选项为ON,则SQL Server不必等待统计量的更新完成,它直接基于过时的统计重编译。

假如足足数量的改动发生在支持统计的列时,统计会被觉得是过时的(stale)。每个表有一个重编译阈(Recompile threshold,RT),用来抉择若干变更发生时该表的任何统计被标志为stale。针对批处置惩罚中的所有表的该RT值,被存储在批处置惩罚的查询计划中。

该RT值依附于表的类型,即持久表照样临时表,还有本次计划被编译时表的行数。精准的抉择RT值的算法随SQL Server的每个Service Package而变更。以下只针对付SQL Server 2008的RTM版:

1、无论持久表照样临时表,假如N

2、对付临时表,算法是相同的,只有一个例外,假如表异常小或空表(N创建临时表的历程,插入6行到表后,只要临时表被造访,表将不得不重编译。

小技术:你可以应用KEEP PLAN查询提示(Query Hint)来创建临时表,以避开频繁重编译的批处置惩罚。可以应用下列语句比较查看对系统机能的改进:

SELECTfrom dbo.PermTable A Inner join #TempTalbe B On B.col1=A.col2 whereOption

3、对付表变量,没有RT值。也便是说,在表变量中不会由于行数的变更而引起重编译。

■ 改动计数器

RT值着实便是SQL Server识别统计是否过时所必要的变更数量。在SQL Server 2005曩昔的版本中,sysindexes系统表中和记娱乐在线官网的列rowmodctr维持跟踪实际发生的变更数量。这个计数器跟踪表或索引的任何行的变更,即就是一个没有被任何索引或有用的统计应用的列发生变更。而SQL Server 2008应用一组列改动计数器或colmodctr。这些计数器长短事务的,即假如事务开始,插入数千行到表中,此是事务回滚,改动计数器的变更却不回滚。不像sysindexes中的rowmodctr,colmodctr值用户弗成见,它只能被查询优化器应用。

■应用colmodctr值跟踪表和索引视图的变更

下表给出影响内部colmodctr值变更的身分:

语句

colmodctr值的变更

insert

每个行被插入后所有colmodctr值加1

delete

每个行被插入后所有colmodctr值加1

update

假如更新到一个非键值列,每行被更新时所有colmodctr值加1

假如更新到一个键值列,对表中的每个列,每行被更新时所有colmodctr值加2

bluk insert

看作N insert操作。N行被插入时,所有colmodctr增添N

truncate table

看作N d和记娱乐在线官网elete操作。N行被插入时,所有colmodctr增添N

■跳过重编译步骤

以下几种环境下,SQL Server会由和记娱乐在线官网于优化斟酌跳过编译一个计划:

1、 当一个计划是一个微小的(trivial)计划。一个trivial计划是基于查询用到和记娱乐在线官网的表,和这些表上的索引(或缺少索引),却没有替代计划。此时,只有一种要领处置惩罚查询,无论是否统计发生改变,任何编译都是挥霍资本。

2、假如一个查询包孕是选项提示Keepfixed plan,SQL Server将不会因为优化相关的缘故原由而重编译计划。

3、假如针对索引的统计自动更新,并且定义在表或索引视图上的统计被禁用,那么所有这些索引和统计引起的优化相关的重编译的计划将竣事。

留意:关闭自动更新内容平日不是一个好的选择,由于这样查询优化器将不再对工具中的数据变更敏感,而子优化查询将不再随意马虎地获得结果。你可以斟酌应用这个技术,仅仅在着末用完所有其他替代措施以避免重编译时作为一个告急(resort)。

4、假如查询中引用的表是只读的,SQL Server将不从新编译计划。

在SQL Server 2000中,当一个批处置惩罚被重编译时,批处置惩罚中的所有语句都将被重编译,并不限于初始化重编译的那个。SQL Server供给语句级其余重编译。这意味着SQL Server在重编译历程中应用更小的CPU光阴和内存。

下文将关注若何从缓存中移除计划和计划缓存内部操作。

转自:http://www.c和记娱乐在线官网nblogs.com/downmoon/archive/2010/07/06/1771616.html

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: