更新时间:2022-08-25 12:01
查询优化器是SQL Server针对用户的请求进行内部优化,生成(或重用)执行计划并传输给存储引擎来操作数据,最终返回结果给用户的组件。查询优化器是关系型数据库管理系统的核心之一,决定对特定的查询使用哪些索引、哪些关联算法、从而使其高效运行,它是优化器中最重要的组件之一。
查询优化器(简称优化器)是负责生成 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”选项中查看每一个查询的执行规划,节点信息将会显示统计是否需要被更新。