SQL语句处理

处理单个SQL语句是SQLServer执行SQL语句的最基本方式。用于处理仅引用本地基表(没有视图或远程表)的单个SELECT语句的步骤说明了基本过程。

优化SELECT语句

SELECT语句是非过程的;它没有说明数据库服务器检索所请求数据应使用的确切步骤。这意味着数据库服务器必须分析语句,以确定提取请求数据的最有效方法。这称为优化SELECT语句。执行此操作的组件称为查询优化器。优化器的输入由查询、数据库模式(表和索引定义)和数据库统计信息组成。优化器的输出是查询执行计划,有时称为查询计划或者只是一个计划。本主题后面将详细介绍查询计划的内容。

下图显示了单个SELECT语句优化期间查询优化器的输入和输出:

SELECT语句的查询优化

SELECT语句仅定义以下内容:

  • 结果集的格式。这主要在选择列表中指定。然而,其他子句(如ORDER BY和GROUP BY)也会影响结果集的最终形式。

  • 包含源数据的表。这在FROM子句中指定。

  • 为了SELECT语句的目的,表在逻辑上是如何关联的。这在连接规范中定义,可能出现在WHERE子句或FROM后面的ON子句中。

  • 源表中的行必须满足的条件才能符合SELECT语句。这些在WHERE和HAVING子句中指定。

查询执行计划是以下各项的定义:

  • 访问源表的顺序。

    通常,数据库服务器可以通过许多序列访问基表来构建结果集。例如,如果SELECT语句引用三个表,数据库服务器可以首先访问表A,使用来自的数据表A从中提取匹配行表B,然后使用中的数据表B从中提取数据表C。数据库服务器可以访问表的其他顺序是:

    表C,表B,表A,或

    表B,表A,表C,或

    表B,表C,表A,或

    表C,表A,表B

  • 用于从每个表中提取数据的方法。

    通常,有不同的方法来访问每个表中的数据。如果只需要几个具有特定键值的行,则数据库服务器可以使用索引。如果需要表中的所有行,数据库服务器可以忽略索引并执行表扫描。如果表中的所有行都是必需的,但有一个索引的键列在ORDER BY中,则执行索引扫描而不是表扫描可能会保存单独的结果集排序。如果表非常小,那么表扫描可能是几乎所有访问表的最有效方法。

从可能的多个计划中选择一个执行计划的过程称为优化。查询优化器是SQL数据库系统中最重要的组件之一。虽然查询优化器使用一些开销来分析查询和选择计划,但当查询优化程序选择有效的执行计划时,这些开销通常会节省几倍。例如,可以为两家建筑公司提供相同的房屋蓝图。如果一家公司在开始时花了几天时间来计划如何建造房屋,而另一家公司则在没有计划的情况下开始建造,那么花时间规划其项目的公司可能会最先完工。

SQL Server查询优化器是一种基于成本的优化器。每个可能的执行计划在所使用的计算资源量方面都有相关的成本。查询优化器必须分析可能的计划,并选择估计成本最低的计划。一些复杂的SELECT语句有数千个可能的执行计划。在这些情况下,查询优化器不会分析所有可能的组合。相反,它使用复杂的算法来寻找一个成本合理接近最小可能成本的执行计划。

SQL Server查询优化器不仅选择资源成本最低的执行计划;它选择的计划是以合理的资源成本向用户返回结果,并以最快的速度返回结果。例如,并行处理查询通常比串行处理查询使用更多的资源,但完成查询的速度更快。如果服务器上的负载不会受到不利影响,SQL Server优化器将使用并行执行计划返回结果。

当查询优化器估计从表或索引中提取信息的不同方法的资源成本时,它依赖于分布统计信息。保存列和索引的分布统计信息。它们指示特定索引或列中值的选择性。例如,在代表汽车的表格中,许多汽车都有相同的制造商,但每辆汽车都有一个唯一的车辆识别码(VIN)。VIN上的索引比制造商上的索引更有选择性。如果索引统计信息不是最新的,查询优化器可能不会为表的当前状态做出最佳选择。有关保持索引统计信息最新的更多信息,请参阅使用统计信息提高查询性能.

查询优化器很重要,因为它使数据库服务器能够动态调整以适应数据库中不断变化的条件,而无需程序员或数据库管理员的输入。这使程序员能够专注于描述查询的最终结果。他们可以相信,每次运行语句时,查询优化器都会为数据库状态构建有效的执行计划。

处理SELECT语句

SQL Server用于处理单个SELECT语句的基本步骤包括:

  1. 解析器扫描SELECT语句并将其分解为逻辑单元,例如关键字、表达式、运算符和标识符。

  2. 构建查询树(有时称为序列树),描述将源数据转换为结果集所需格式所需的逻辑步骤。

  3. 查询优化器分析访问源表的不同方式。然后,它选择一系列步骤,以最快的速度返回结果,同时使用更少的资源。查询树将被更新以记录这一系列准确的步骤。查询树的最终优化版本称为执行计划。

  4. 关系引擎开始执行执行计划。在处理需要来自基表的数据的步骤时,关系引擎请求存储引擎传递来自关系引擎请求的行集的数据。

  5. 关系引擎将存储引擎返回的数据处理为为结果集定义的格式,并将结果集返回给客户端。

处理其他报表

描述的处理SELECT语句的基本步骤适用于其他SQL语句,如INSERT、UPDATE和DELETE。UPDATE和DELETE语句都必须以要修改或删除的行集为目标。标识这些行的过程与标识SELECT语句结果集中的源行的过程相同。UPDATE和INSERT语句可能都包含嵌入式SELECT语句,这些语句提供要更新或插入的数据值。

即使是数据定义语言(DDL)语句,例如CREATE PROCEDURE或ALTER TABLE,最终也会被解析为系统目录表上的一系列关系操作,有时(例如ALTER STABLE ADD COLUMN)也会对数据表执行一系列关系操作。