理解 SQL 执行计划(第一部分)






1.90/5 (6投票s)
简要介绍 t-SQL 如何被解析并提交给 SQL 引擎以检索数据
哦!!!为什么我的SQL查询需要这么长时间来检索数据...?
当我们的SQL查询需要很长时间来执行时,这是一个常见的问题。 因此,我将简要描述当我们执行任何查询时会发生什么。
引言
要了解执行SQL查询时发生的情况,我们必须知道执行(SQL语句的解析)是如何发生的。 基本上,SQL查询将按“从上到下,从左到右”的顺序进行解析。
理解SQL执行
每当我们执行任何SQL查询(语句)时,SQL Server都会通过分两个阶段处理此查询来给出输出。
1. 关系引擎
2. 存储引擎
我们的SQL查询将首先被提供给SQL Server的关系引擎,以分析所有语句。 也就是说,在这里我们的查询将被解析并进行优化,以便SQL Server可以在该查询上进行事务处理。 此时,我们的查询将处于优化状态,也就是说它是可以在数据库上提取以检索或更新数据的最短执行计划。
然后,在此之后,这种优化后的查询将以二进制数据的形式提交给存储引擎,在那里将在数据库上进行实际的执行。 所有数据的检索或修改都将在此处进行。
因此,通过这两个步骤,我们的查询将被执行,并且我们将获得结果。 因此,我们将重点关注执行计划的“关系引擎”部分,因为从这里我们将获得问题的答案“为什么我的查询需要很长时间才能执行?”。
关系引擎
- 首先,我们的查询将针对T-SQL的所有语法进行检查,此过程称为“解析”,并且此过程的输出将以称为“序列树”的形式出现。
- 此“序列树”将提供给称为“代数化器”的进程,该进程将检查“DML”语句中的所有表名、列名及其数据类型,并针对数据库进行验证。并且此过程将给出称为“查询处理器树”的二进制输出。
- 此“查询处理器树”将被提供给一组称为“查询优化器”的软件。这些软件将基于已经创建的执行计划以及来自数据库服务器的统计信息来计算执行路径。
- 此优化器将为计划中给出的每个步骤赋予一个数字,该数字称为“估计成本”,并且所有步骤的此成本将被称为准备执行计划的估计成本。并且此计划将用于执行查询。
- SQL Server将检查“计划缓存”中执行计划的可用性,如果已经可用,则将使用该计划,如果不可用,则将其添加到计划缓存中。
- 然后,该计划将提供给存储引擎以实际执行查询。
- 请注意,这是“估计执行计划”,而不是“实际执行计划”,后者将在存储引擎中的处理过程中提取。
- 是的,但是当此估计计划存在于实际执行计划的计划缓存中时,存储引擎将使用该缓存中的实际执行计划,因为此计划已被查询引擎(存储引擎)使用。
为什么我们看到估计计划和实际计划之间的差异
当我们生成估计计划并且实际上运行查询并获得实际执行计划时,它们之间可能会存在一些差异。 这种差异可能是由于以下情况造成的。
- 由于没有在查询优化器中使用的正确统计信息。可能由于表中的数据发生变化以及索引发生变化,导致统计信息发生变化,并且它们可能会影响估计执行计划的生成,因此可能有一些原因导致没有正确统计信息。
- 由于执行计划无效。这可能是这样的情况,例如,我们在查询中使用CREATE TABLE语句。因为代数化器处理已经可用的元数据,所以当我们请求包含CREATE语句的查询的估计执行计划时,它将给出错误,但是当我们使用实际执行计划运行此查询时,它将给出实际执行计划。
下一篇
在本篇文章的下一部分中,我将向您展示如何使用执行计划来改进我们的查询。第二部分将很快发布。
参考文献
电子书《解剖SQL Server执行计划》作者 Grant Fritchey。