首页 > Linux操作系统 > Linux操作系统 > 续-执行计划基本知识
一旦生成执行计划,接着就进入了存储引擎,查询计划实际执行的地方。
l 估计执行计划和实际执行计划
有两种类型的执行计划,第一种是由查询优化器输出的计划,称之为“估计执行计划”,第二种是实际执行计划,它是一条查询执行时真正处理的计划。
对SQL Server来说,产生执行计划的代价比较高,因此尽可能的可以重用执行计划。当创建时,会存储在内存中的一块区域(通常叫做过程缓存区)。当提交一条SQL到服务器时,查询优化器为创建一条估计的执行计划,在进入存储引擎前,查询优化器将估计的执行计划与现有过程缓存区的实际执行计划相比较,如果两者匹配,查询优化器则重用现有的计划,从而避免了创建实际执行计划的开销。
执行计划并不是永久存储在内存中,SQL SERVER使用一种过期的算法来估计执行计划使用的次数(例如一条开销为10的执行计划,使用了5次,则其过期值为50)。Lazywriter进程,用于释放过程缓存中引用过期的执行计划,通过每次减1的方式来定期地扫描缓存的对象。
当满足以下条件时,该计划从内存中删除:
l 系统需要更多的内存
l 计划的Age值达到了0
l 计划当前并未被使用
一些事件和行为也容易导致执行计划重编译,重编译是代价比较高的操作,尽量避免重编译。以下事件容易导致重编译:
n 引用查询的表架构改变
n 使用查询的索引改变
n 删除使用查询的索引
n 更新引用查询的统计信息
n 调用函数,sp_recompile
n 使用触发器的表
n 在单一查询中,DDL和DML混合使用
n 改变执行计划的SET选项
n 改变查询中使用的临时表结构或架构
n 查询中使用的动态视图发生改变
n 查询中使用的游标选项发生改变
n 远程行集发生改变(分布式分区视图)
n 使用客户端游标时,对于FOR BROWSE选项发生改变
由于缓存在执行计划中起着主要作用,需要借助一些工具来查看或分析计划缓存,你可能想查看某个计划编译花费了多长时间或者查看创建不同计划可能会有多大的调整。要清除整个缓存,运行以下命令:
DBCC FREEPROCCACHE
若要查看缓存内的对象来分析优化器和存储引擎如何创建计划,可以借助于动态管理视图或动态管理函数,如下的语句:
通过上面的语句片断我们可以查看该SQL执行时产生的XML计划,也可以直接以图形执行计划打开。
通常你可能看不到关于实际的执行计划和估计的执行计划之间的不同,不过,在某种情况下可能会导致两者间的不同:
l 当统计信息过期
实际执行计划与估计执行计划之间不同的主要原因是由于统计信息与实际数据的不同。这通常是随着时间的增加,数据的添加和删除所致。这也必然导致定义索引的键发生改变或数据分布发生了改变。若自动更新统计开关打开的话,系统仅取样一部分数据,其目的主要降低运行查询的开销。这也说明了随着时间的积累,该统计信息也变得不太精确,这不仅导致了计划的不同,也由于统计数据的过期导致获得性能较劣的执行计划。
l 当估计计划无效时
你可能得到如下错误信息:
Msg 208, Level 16, State 1, Line 7
Invalid Object name 'TempTable'
查询优化器主要生成估计执行计划,并不执行T-SQL。由于查询还未执行,并不存在临时表对象,也就是错误生产的原因所在。若运行该段代码,从实际的执行计划则运行正常。
l 当出现并行请求时
当计划满足并行度的阀值,则会生成两个计划。或许在估计执行计划中可能会看到一个计划或并行运算符。而查询实际执行时,可能会看到完全不同的计划,这主要取决于查询引擎此刻是否能支持并行查询还是调用了并行查询。
SQL Server仅提供一种类型的执行计划(估计或实际),但是查看执行计划有三种不同的格式:
u 图形计划
u 文本计划
u XML计划
图形计划:
它是最快且最易读,但是隐藏了部分计划数据。估计执行计划和实际执行计划均可以通过图形执行查看。
文本计划:
它略微有点难读,但是提供了更多的有用信息,它也有三种格式:
SHOWPLAN_ALL:显示估计计划的全部信息
SHOWPLAN_TEXT:提供有限的数据,不过也显示估计执行计划的信息
STATISTICS PROFILE:与SHOWPLAN_ALL类似,还提供实际执行计划的信息
XML计划:
XML计划描述了计划中最完整的数据,以结构化的XML格式显示,它也有两种XML计划:
SHOWPLAN_XML:执行之前由查询优化器产生的计划
STATISTICS_XML:实际执行计划的XML格式
小结:
上述简要介绍了关于查询执行、执行计划重用以及估计计划与实际计划的不同等,后续将通过例子来介绍。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/355374/viewspace-598183/ ,如需转载,请注明出处,否则将追究法律责任。