查询优化器是数据库中负责生成 SQL 语句的有效执行计划的数据库引擎组件,具体地说,查询优化器是针对用户的请求进行内部优化,生成(或重用)执行计划并传输给存储引擎来操作数据,最终返回结果给用户的组件。它是关系型数据库管理系统的核心之一,决定对特定的查询使用哪些索引、哪些关联算法、从而使其高效运行,它是优化器中最重要的组件之一。
主流的查询优化器主要包括两种,即基于语法的和基于成本的。
基于语法的查询优化器完全根据查询的准确语法来选择规划,这是建立在查询中子句的顺序的基础上的。一旦选定了一个规划,该查询就将完全按照该计划执行,并且执行的顺序就是子句的顺序。基于语法的查询不需要保存分布统计。随着表的分布的改变,一段时间后,所选定的查询规划就可能不再有那么好的性能。
基于成本的查询优化器分析数据和索引列的分布统计,从而根据完成查询的成本决定效率最高的执行规定。成本是根据资源利用率来测量的。响应时间也是影响成本的一个因素。数据库寻求能够以最快的速度把结果返回给用户并且不会导致其他方面性能下降的途径。因此,在具有多个处理器的系统中,查询处理器可能选择这样的执行规划,虽然它的总体成本比其他的执行规划要大一些,但是它可以更快地把结果返回给用户,并且不会降低其他方面的性能。
分布统计是从索引和表中的数据列的分布信息汇总出来的,并且由数据库自动在建立了索引的列上创建和维护。也可以选择把统计建立在没有索引的列上。基于成本的优化器将分析各种查询规划,并且作为其评价标准的信息,包括被请求的数据量以及处理过程花费的时间,具体表现在对CPU和内存的影响以及I/O操作的次数。
资料来源:
黄钊吉著 .SQL Server性能优化与管理的艺术.北京:机械工业出版社,2014
[美]Jenney Lynne Fields著 袁勤勇 何欣等译.Microsoft SQL Server 2000优化指南.北京:清华大学出版社,2001
微软公司著.数据库程序设计:SQL Server2000数据库程序设计 .北京:高等教育出版社,2007