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 为何预估和实际的执行计划可能不同
一般情况下,你看到的预估执行计划和实际执行计划很可能是一样的,然而当环境改变时可能会导致二者的不同。
陈旧的统计数据
● 统计数据和实际数据间的差异是导致两个执行计划不同的主要原因。通常发生在有数据插入和删除,改变了索引的键值以及分布。
● 为了降低操作成本,原子性的统计数据操作是取样于数据的子集。这就意味着,随着时间推移,统计数据就越来越不能准确反映实际数据。
● 这不仅会导致两个执行计划间的差异,还会导致产生“坏”的执行计划。