
查询最佳化器
查询最佳化器是SQL Server针对用户的请求进行内部最佳化,生成(或重用)执行计画并传输给存储引擎来运算元据,最终返回结果给用户的组件。查询最佳化器是关係型资料库管理系统的核心之一,决定对特定的查询使用哪些索引、哪些关联算法、从而使其高效运行,它是最佳化器中最重要的组件之一。
基本介绍
- 中文名:查询最佳化器
- 外文名:query optimizer
- 简称:最佳化器
- 类型:基于语法和基于成本的最佳化器
- 地位:是关係型资料库管理系统核心之一
- 套用学科:资料库管理
定义
查询最佳化器(简称最佳化器)是负责生成 SQL 语句的有效执行计画的 SQL Server 资料库引擎组件,具体地说,查询最佳化器是SQL Server针对用户的请求进行内部最佳化,生成(或重用)执行计画并传输给存储引擎来运算元据,最终返回结果给用户的组件。它是关係型资料库管理系统的核心之一,决定对特定的查询使用哪些索引、哪些关联算法、从而使其高效运行,它是最佳化器中最重要的组件之一。
类型
基于语法
基于语法的查询最佳化器完全根据查询的準确语法来选择规划,这是建立在查询中子句的顺序的基础上的。一旦选定了一个规划,该查询就将完全按照该计画执行,并且执行的顺序就是子句的顺序。基于语法的查询不需要保存分布统计。随着表的分布的改变,一段时间后,所选定的查询规划就可能不再有那幺好的性能。
基于成本
基于成本的查询最佳化器分析数据和索引列的分布统计,从而根据完成查询的成本决定效率最高的执行规定。成本是根据资源利用率来测量的。回响时间也是影响成本的一个因素。SQL Server寻求能够以最快的速度把结果返回给用户并且不会导致其他方面性能下降的途径。因此,在具有多个处理器的系统中,查询处理器可能选择这样的执行规划,虽然它的总体成本比其他的执行规划要大一些,但是它可以更快地把结果返回给用户,并且不会降低其他方面的性能。
分布统计是从索引和表中的数据列的分布信息汇总出来的,并且由SQL Server自动在建立了索引的列上创建和维护。也可以选择把统计建立在没有索引的列上。基于成本的最佳化器将分析各种查询规划,并且作为其评价标準的信息,包括被请求的数据量以及处理过程花费的时间,具体表现在对CPU和记忆体的影响以及I/O操作的次数。
工作过程
在提交查询之后,执行以下几个步骤将原始查询转换为查询最佳化器能够解释的格式。
解析过程
解析是分析SQL语句并将其转换成可被编译的数据结构的过程,解析过程还包括确认SQL语句语法的有效性。解析过程对引入的查询进行语法检查,并将该语法分解成多个关係资料库引擎能够回响的部分。本步骤的输出是解析后的查询树。
解析并不包括诸如检查表名和列名的有效性这样的操作,这些操作将在规範化过程中处理。规範化过程主要确定SQL语句所引用的对象的特徵,并检查请求语义是否正确。例如,尝试执行一个表在语义上是不合逻辑的。
标準化过程
标準化过程把查询转换成最佳化过程可以使用的格式,检测到的任何冗余语法的子句都要被移除。如果有可能,也将子查询标準化。本步骤的输出是一个标準化的查询树。
查询最佳化
从几个可能的计画中选择一个执行计画的过程称为最佳化。这个阶段包括很多步骤,不过,对执行计画的开销影响最大的步骤只有查询分析、索引选择和联接选择。
编译
这个阶段是把查询编译成可执行的代码。
资料库访问例程
查询最佳化器通过扫描表或使用可用的索引,来确定访问数据的最好方法,然后会套用该方法。
关係
查询最佳化器使用表和索引的分布统计来决定查询的效率最高的执行规划。查询最佳化器使用分布统计来估计能够满足查询的每一个规划的资源消耗,例如索引或者视图,保持当前的分布统计是维持SQL Server的良好性能的关键。
统计的更新方式有两种:如果数据已经存在于表中,就会在第一次创建索引的时候进行更新;另外一种方式是在执行UPDATE STATISTICS命令的时候进行更新。UPDATE STATISTICS命令可以手工或者自动执行。可以把统计的更新定义为资料库维护计画的一部分,或者由自动更新功能来触发。如果统计信息过时了,查询最佳化器不能做出最明智的决定。如果在Query Analyzer的“Graphical ShowPlan”选项中查看每一个查询的执行规划,节点信息将会显示统计是否需要被更新。