SQL执行计划解析之执行计划基础上篇

发表于:2011-9-15 10:04

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:chouyuu    来源:51Testing软件测试网采编

  1.4 预估的和实际的执行计划

  如前所述,有两种不同的执行计划,第一个是由优化器产生的预估的执行计划(Estimated execution plan),操作符和步骤被贴了Logical标签,代表了优化器的观点,另一个是实际的执行计划(Actual execution plan),代表了实际发生的事情。

  1.5 重用执行计划

  服务器产生执行计划开销是昂贵的,可能的情况下Sql Server会尽量保持和重用执行计划。执行计划生成后就被存储进内存Plan Cache。

  执行计划并不是永久驻留内存,它们会慢慢地根据age变化从系统消失,age的计算公式为执行计划的预估开销*被使用的次数,例如一个计划它的开销是10,被引用了5次,那么它的age值就是50。延迟写入(lazywriter)进程负责释放所有类型的cache(包括plan cache),它周期性地扫描cache里的对象,并每次减去一定的age值。如果达到下列条件,执行计划将会从内从中被清除:

  1)系统需要更多内存

  2)age值达到了0

  3)执行计划没有被任何连接(connection)所引用

  执行计划也不是不可改变的,有些事件或动作会迫使执行计划重新编译。记住这些很重要,因为重新编译执行计划的开销可能非常大,下面的动作会导致执行计划重新编译:

  1)改变查询中引用的表的结构或schema

  2)改变了查询中用到的索引

  3)删除了查询中用到的索引

  4)更新了查询用到的统计数据

  5)调用了函数sp_recompile

  6)对查询用到的表的keys进行了大量insert或delete操作

  7)对带有触发器的表,因inserted和deleted导致的明显增长

  8)一个查询中混合了ddl和dml

  9)查询执行中改变了SET选项

  10)改变了查询使用的临时表的结构或schema

  11)改变了查询中用到的动态试图(dynamic views)

  12)改变了查询中的游标选项

  13)改变了远程行集,就像在分布式分割试图(distributed partitioned view)里边

  14)使用客户端游标时,改变了FOR BROWSE选项

  1.6 为何预估和实际的执行计划可能不同

  一般情况下,你看到的预估执行计划和实际执行计划很可能是一样的,然而当环境改变时可能会导致二者的不同。

  陈旧的统计数据

  ● 统计数据和实际数据间的差异是导致两个执行计划不同的主要原因。通常发生在有数据插入和删除,改变了索引的键值以及分布。

  ● 为了降低操作成本,原子性的统计数据操作是取样于数据的子集。这就意味着,随着时间推移,统计数据就越来越不能准确反映实际数据。

  ● 这不仅会导致两个执行计划间的差异,还会导致产生“坏”的执行计划。

32/3<123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号