简单地说,一条执行计划是查询优化器以最有效的方式来实现用户提交的T-SQL查询请求的结果。
通过执行计划,可以让你了解一条查询是如何执行,因此,对于众多DBA来说,解决性能较慢的查询主要目标就是了解查询计划的工作原理,而不是猜测特定的查询执行了上千次扫描。你可以使用执行计划来找出导致性能问题的完整SQL代码片断,例如:可能是由于扫描整张表,然而只需要的行,所有的这些都可以在执行计划中找到。
本章的目的是帮助你来捕获实际和估计的执行计划,可以通过图形、文本或XML格式来描述它们的工作原理,本章先介绍以下几个主题:
查询优化器的简单背景
执行计划是优化器的产物,因此对于了解其工作内容和运行机制很有帮助。
1.1 查询优化器的历史
Ø 当提交查询时发生了什么?
当提交一条查询给SQL Server数据库时,服务器需要做一系列的进程来运行查询,所有这些进程的主要工作是管理这样一个系统,如提供数据的存储、维护数据的完整性。
提交给SQLServer的每一条查询都由这些进程来处理,同时在SQLServer内则有许多不同操作发生。这里主要专注于T-SQL范围的进程处理,大体可以划分以下两个阶段:
l 在关系引擎中处理
l 在存储引擎中处理
在关系引擎中,查询首先解析,然后由查询优化器来处理,从而生成一条执行计划,接着该计划以二进制的形式发送给存储引擎,存储引擎用于获取或更新底层的数据。存储引擎主要负责诸如锁、索引维护、事务处理的工作。由于执行计划是关系引擎中产生,因此是需要研究的重点。
1.1.1 查询解析
当提交一条T-SQL查询到SQL Server时,首先要经过关系引擎。
注:T-SQL查询可以是从命令行(cmd)执行的一条ad hoc查询,也可以是存储过程执行的数据请求,也可能是单批中的任何T-SQL语句或位于GO之间的多个T-SQL语句。
一旦收到T-SQL时,首先通过一系列的语法检查,此步称之为查询解析,解析的结果以解析树的形式输出,该树描述了执行该请求的执行查询的逻辑步骤。
如果该T-SQL操作不是一个DML语句,则该T-SQL不做优化处理,例如:对于SQLServer而言,创建表(Create Table)并没有提高性能的处理。若T-SQL串是一个DML语句,该解析树则由algebrizer进程来处理,algebrizer负责不同对象(表、列以及查询串中引用的其它对象)的解析。像类型标识符(varchar(50)与nvarchar(25))。诸如GROUP BY和MAX这样的聚合函数也需要由algebrizer来决定在查询树的位置。
Algebrizer则输出一个格式为二进制的查询树,进而递交给查询优化器。
1.1.2 查询优化器
查询优化器基本上是关系引擎工作抽象的一个软件模型,通过使用查询树和包含数据的统计信息,然后应用该模型,从而以最优的方式来执行该查询,也就是产生一条执行计划。
换句话说,优化器计算出实现T-SQL查询提交请求的最佳实现,可以根据访问的数据是否通过索引、连接的类型或其它更多的信息来判断。查询优化器采取的方法主要基于给定执行计划的开销,如需要处理的CPU和I/O资源,也就是“基于开销”的计划。
查询优化器产生并估算许多计划,一般来说,选取最低开销的计划,也就是执行最快消耗最少CPU和I/O资源的计划。由于执行速度的计算是最重要的计算,因此查询优化器则采用更为精确的CPU运算进程以便返回的结果更快。
如果提交一条简单的查询,如:没有索引、聚合或计算的单表,而不需要花过多时间来计算可优的计划,查询优化器则简化选取一个普通计划。
如果该查询并不是普通的计划,查询优化器则根据开销计算来选择一个计划,通常这主要取决于由SQLServer维护的统计信息。
关于数据库中的列和索引收集的统计信息描述了数据的分布、唯一性以及选择度。构成统计信息以“柱状图”形式展现。
对于相关列或索引的统计信息,查询优化器会使用它们来计算。默认统计信息由系统自动创建和更新。表变量并不持有统计信息,无论表变量实际大小有多大,查询优化器假定只有一行,而临时表则持有统计信息,并储存供查询优化器使用的信息。
查询优化器借助于这些统计信息和查询优化树一并计算出最佳的计划,这通常需要一系列的计划,测试不同类型的连接,重组连接顺序,尝试不同的索引等等,直至找到执行最快的计划。这些信息也就是估计开销。每一阶段的开销累积也就是执行计划自身的开销。
重要的是:估计开销仅仅是一个估计,查询优化器利用充足的时间和最新的统计信息来找到符合查询的执行计划。不过,它还是以尽可能花较少时间来计算出一个最佳计划,这要取决于统计信息。
在查询优化器生成一个执行计划后,实际的计划则存储在称之为“过程缓存”的内存区域。查询优化器会产生其他的计划并与缓存中先前的计划比较,若找到匹配,则重用该计划。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/355374/viewspace-598093/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/355374/viewspace-598093/