查询优化器
查询优化器是关系型数据库管理系统的核心之一,决定对特定的查询使用哪些索引、
哪些关联算法,从而使其高效运行。它是优化器中最重要的组件之一。
查询优化器(简称优化器)是 SQL Server针对用户的请求进行内部优化,生 成 (或重 用)执行计划并传输给存储引擎来操作数据,最终返回结果给用户的组件。SQL Server的 优化器是基于开销(cost-based)的优化器。通过针对特定DML语 句 (绝大部分DDL语句 不需要优化),借助统计信息(详见5.4节)及当前硬件信息,分析出一定数量的“可能的执
行方式”,即候选执行计划,最终选择一个最低开销的预估执行计划。所以,优化器是SQL
Server中对性能影响最大的组件,同一个语句,执行计划不同,就可能导致小时级别的差 异。简单来说.,优化器的任务就是生成预估执行计划,注意这里是预估而不是实际执行计
划。对于执行计划,将在第8章介绍。
理解优化器的工作原理能帮助DBA和开发人员编写更高效的语句。本章所用的示例来
源于 SQL Server 2008 R2 的示例数据库 AdventureWorks2008R2。
5 . 1 查询过程
从第3 章的图3-1中可以知道,SQL Server数据库引擎的核心组件包括:存储引擎和 査询处理器(也叫关系引擎)。存储引擎用于管理磁盘和内存之间的数据关系,维护数据的
一致性和优化并发性。关系引擎接收所有提交到SQL Server的DML语句,生成对应的“最 优”执行计划,然后执行这些计划,并返回所需的数据。
T-SQL语句是高级声明性语言,它仅告诉SQL Server要做什么,而不会告诉它要怎么 做。所以,当查询被接收时,第一步是进行语法分析。如果语法分析不通过,就会返回错
误并结束整个过程;如果通过,会生成SQL Server可以识别的格式,该格式称为查询树。 然后经过优化器的优化,生成最优的预估执行计划。
图5-1展示了一个查询的处理流程。
下面针对该流程做简要介绍。
1) 分析和绑定:如果输人的查询有效,会在这个过程中产生一个逻辑树,每个节点表
示查询需要执行的逻辑步骤,比如读取特定的表,进行inner join等。 2) 查询优化:针对上面产生的逻辑树,优化器会产生数个执行方案,这些方案是一
系列的物理操作,比如索引查找、哈希连接等。但是优化器往往无法产生所有可能的方案,
所以会针对资源及其他信息,评估每个方案的开销,并选择最低开销的方案,最后产生出
预估执行计划。
3) 执行查询,缓存执行计划:在该步骤中,执行计划被传输到存储引擎中执行,并把
计划缓存到内存中,这部分的内存称为plan cache。 待查询提交后,分析和绑定是第一个发生的操作。分析操作用于确保T-SQL语句可用,
即确定语法是否正确,比如检查是否把“ SELECT” 写错为“ SEELECT"。然后査询语句
会被转换成包含逻辑操作符的逻辑树,也称为分析树,这些逻辑操作符通常是查询中的逻
辑操作,比如访问Customer表并获取数据,执行inner join等。绑定操作最主要的是解决 命名问题(比如处理别名是否有误等问题),在产生分析树后,SQL Server需保证查询中的 所有对象都存在,然后产生代数树,并传输给优化器。
当代数树传送到优化器时,将通过开销预估模型分析,产生出一定数量的候选执行计
划并评估各个计划的开销,最后选择开销最低的执行计划。在这个过程中,会把代数树中
的逻辑操作映射成一些物理操作,这些物理操作会被执行引擎运行。执行引擎则根据这些
物理操作,执行一系列的实际数据操作,最终返回结果数据。至此,查询完毕。
电 话:400-123-4567
传 真:+86-123-4567
手 机:13800000000
邮 箱:admin@eyoucms.com
地 址:广东省广州市天河区88号