SQL Server查询优化器:最佳执行计划

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

我们知道,查询优化器的基本的目标就是为我们的查询语句找出一个比较高效的执行计划。即使是一个非常简单的查询,也会存在很多的不同方式去访问数 据,而这些不同的方式都是可以得到相同的结果的,所以,查询优化器必须要很“明智的”从这些大量的执行计划中找出了一个“最佳”的出来。
  前一篇:浅析SQL Server查询优化器的工作原理

   为了得到最好的计划,查询优化器必须在某些条件的限制下,尽可能多的创建和评估大量的候选执行计划。看到这里,就有一点需要注意了“查询优化器是尽可能 多的创建候选执行计划”,而不是为一个查询产生所有的执行计划。在SQL Server中,我们把一个查询产生的候选执行计划的集合称之为“搜索空间(search space)”。很显然,搜索空间中的所有的执行计划都返回相同的结果。

  给一张示意图,让大家更好理解一点,如下所示:

注:图中的Search Space中的曲线代表执行计划

   从理论上说,为了找到最佳的执行计划的查询,基于成本的查询优化器应该生成搜索空间中存在的所有可能的执行计划,并正确估计每个计划的成本。然而,一些 复杂的查询可能有成千上万,或者甚至数百万可能的执行计划,查询优化器不可能去产生并评估一个查询的每一个候选的执行计划,如果那样,评估所有计划的时间 会非常的长,并且严重影响查询的整体的执行时间。

  查询优化器必须优化的时间和执行计划的质量之间取得平衡。 例如,如果查询优化器花1秒钟的时间找到了一个比较好的执行计划,并且这个计划的执行时间是1分钟,那么这个时候,就没有必要再去花费5分钟的时间去为这 个查询找更优的执行计划。因此SQL Server不会做一个详尽的全部查找,而是尽快找到一个合适的有效的计划。由于查询优化器是有时间限制的,那么就可能选择的计划可能是最优方案,也有可 能只是一些接近最优的方案。

  候选的执行计划是在查询优化器的内部通过使用转换规则,启发式算法产生的。候选 的执行计划在优化过程中一直保存在称之为“Memo(中文翻译可能为“备忘录”,以后我们就直接使用英文名称,很多的技术术语翻译过来之后就变味了)”的 内存组件中。从这里我们就可以知道:如果为了复杂的查询产生所有的候选执行计划势必会占用大量的内存。

  我们这里只是简单的介绍一下候选执行计划的产生,后面我们会对每一个步骤进行详细的分析。

  执行计划成本估算

   查询优化器需要为产生的候选的执行计划进行成本的估算,从而选择一个成本最低的。为了估算一个计划的成本,查询优化器会使用一些成本估算的公式来计算一 个计划的成本,这些成本估算公式会考虑很多资源的使用,例如CPU,I/O,内存等。成本估算主要是取决于算法中采用的物理操和估算的将要处理的数据记录 的量(估算数据记录的量也被称之为“基数估算”)。

  为了便于进行基数估算,SQL Server会使用并且维护统计数据(statistics),统计数据描述了表中数据的值的分布情况,或者简单的理解为“元数据-描述数据的数据”。一 旦采用基数估算得出了吗,每个操作的成本和对资源的要求,那么查询优化器就会将这个成本数值进行累计,从而得出整个就会的成本。我们这里不会讨论过多与统 计数据相关的知识,在后面中会详细的讲述。

  在下一篇文章中,我们会讲述计划的执行与缓存,以及与Hint相关的话题。

本文出自seven的测试人生公众号最新内容请见作者的GitHub页:http://qaseven.github.io/

目录
相关文章
|
7月前
|
SQL 关系型数据库 MySQL
MySQL进阶突击系列(07) 她气鼓鼓递来一条SQL | 怎么看执行计划、SQL怎么优化?
在日常研发工作当中,系统性能优化,从大的方面来看主要涉及基础平台优化、业务系统性能优化、数据库优化。面对数据库优化,除了DBA在集群性能、服务器调优需要投入精力,我们研发需要负责业务SQL执行优化。当业务数据量达到一定规模后,SQL执行效率可能就会出现瓶颈,影响系统业务响应。掌握如何判断SQL执行慢、以及如何分析SQL执行计划、优化SQL的技能,在工作中解决SQL性能问题显得非常关键。
|
6月前
|
SQL
【YashanDB知识库】使用leading hint调整SQL执行计划后报错YAS-04522 invalid hint leading
【YashanDB知识库】使用leading hint调整SQL执行计划后报错YAS-04522 invalid hint leading
【YashanDB知识库】使用leading hint调整SQL执行计划后报错YAS-04522 invalid hint leading
|
6月前
|
SQL 数据库 数据安全/隐私保护
SQL查询优化:where子句的高效使用方式
总的来说,如果将 SQL 查询比喻为一个乐团的演奏,WHERE 子句就像是独奏者,它需要各位乐手的协助,才能发挥出最美妙的音乐。计划好你的演奏,挑选对的音符,在最适当的时间开始演奏,那么,你可以更高效地运用 SQL 查询,更好地把握数据的篇章。
121 19
|
6月前
|
SQL 数据库 数据安全/隐私保护
SQL查询优化:where子句的高效使用方式。
总的来说,如果将 SQL 查询比喻为一个乐团的演奏,WHERE 子句就像是独奏者,它需要各位乐手的协助,才能发挥出最美妙的音乐。计划好你的演奏,挑选对的音符,在最适当的时间开始演奏,那么,你可以更高效地运用 SQL 查询,更好地把握数据的篇章。
88 13
|
7月前
|
SQL
【YashanDB 知识库】使用 leading hint 调整 SQL 执行计划后报错 YAS-04522 invalid hint leading
在 YashanDB 的所有版本中,使用 leading hint 调整 SQL 执行计划时可能出现“YAS-04522 invalid hint leading”错误,导致 SQL 无法正常执行。原因是 YashanDB 优化器的 Bug。解决方法为避免使用 leading hint。可通过创建测试表 a、b、c 并执行特定 SQL 语句来验证问题是否存在。
|
6月前
|
SQL 存储 关系型数据库
【YashanDB知识库】如何从内存中获取SQL语句的执行计划
【YashanDB知识库】如何从内存中获取SQL语句的执行计划
|
6月前
|
SQL
【YashanDB知识库】过期统计信息导致SQL执行计划变差
【YashanDB知识库】过期统计信息导致SQL执行计划变差
|
6月前
|
SQL
【YashanDB知识库】收集分区表统计信息采样率小于1导致SQL执行计划走偏
【YashanDB知识库】收集分区表统计信息采样率小于1导致SQL执行计划走偏
|
11月前
|
SQL Oracle 关系型数据库
Oracle SQL:了解执行计划和性能调优
Oracle SQL:了解执行计划和性能调优
234 1
|
12月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")