SQL执行计划

一、执行计划是什么

执行计划(execution plan,也叫查询计划或者解释计划)是数据库执行 SQL 语句的具体步骤。执行计划可以让你知道复杂的sql语句是怎么执行的,有没有按照你想的方案执行,有没有按照最高效的方式执行,使用了众多索引的哪一个,通过索引还是全表扫描访问表中的数据,连接查询的实现方式和连接的顺序,怎么排序,怎么合并数据的,有没有造成不必要资源浪费等等。执行计划的图表是从右向左看的。如果 SQL 语句性能不够理想,我们首先应该查看它的执行计划。


二、执行计划展现形式

文本、xml、图形化


三、执行计划展现工具

1、数据库工具

MySQL Workbench、 Oracle SQL Developer、

SQL Server Management Studio、 DBeaver

前三种都是集成开发环境(IDE),仅可用于自己本身的数据库。

DBeaver 是一个通用的数据库工具和 SQL 客户端,支持多种数据库系统,包括但不限于以下几种:

1.关系型数据库:MySQL、PostgreSQL、SQLite、Microsoft SQL Server、Oracle、DB2、Sybase、SQL Anywhere、HyperSQL 等。

2.NoSQL 数据库:MongoDB、Cassandra、Redis、InfluxDB 等。

3. 大数据平台:Apache Hive、Apache HBase、Google BigQuery、Exasol 等。

以上四种工具可以查看图形化的执行计划。

2、数据库命令

SQL执行计划_数据库

这张图片展示的是各数据库提供的查看执行计划的命令。


四、 各数据库展现出来的执行计划

以SQL Server、PostgreSQL、MySQL为例

1、SQL Server

SQL Server Management Studio 提供了查看图形化执行计划的简单方法。

SQL执行计划_SQL_02

选择要执行的sql语句,点击上图其中一个执行计划,预估执行计划可以立即显示,通过预估执行计划你可以立即得到想要执行语句的信息,而实际执行计划则需要执行sql语句后出现。预估执行计划不等于实际执行计划,但是绝大多数情况下实际的执行计划跟预估执行计划都是一致的。统计信息变更或者执行计划重编译等情况下,会造成不同。

预估执行计划

SQL执行计划_数据库_03

实际执行计划

SQL执行计划_SQL_04


SQL执行计划_数据库_05


SQL执行计划_SQL_06

Actual Number of Rows Read:实际读取的行数

Actual Number of Batches:实际批次数

Number of Executions:这个值表示执行计划中的一个操作在查询执行过程中被调用的次数

Actual Rebinds:实际重新绑定

Actual Rewinds:实际重绕





查询的成本(Query Cost):这个值表示查询执行的总成本估计值,是一个综合性的度量。它可以帮助你比较不同执行计划的相对效率。

实际行数:这两个指标用来比较查询执行过程中实际返回的行数和优化器预估的行数。如果它们之间存在较大差异,可能意味着统计信息过时或者查询需要优化。

操作的类型(Operator Types):了解查询执行计划中每个操作的类型,比如索引扫描、表扫描、连接操作等,有助于理解查询的执行流程。

操作的成本(Operator Cost):这个值表示每个操作的成本估计值,可以帮助你识别哪些操作对整个查询的性能影响最大。

索引使用情况(Index Usage):查询执行计划会显示哪些索引被使用,以及它们被用来进行什么样的操作,比如索引扫描、索引查找等。

Join 类型及条件(Join Type and Conditions):了解连接操作的类型(如嵌套循环连接、哈希连接、合并连接)以及连接操作的条件,可以帮助你优化查询的连接性能。

I/O 操作(I/O Operations):这些指标告诉你查询执行过程中涉及的

实际执行次数(Actual Number of Executions):这个指标告诉你每个操作实际执行的次数,有助于发现重复操作或者频繁执行的操作。

实际重新绑定:表示在查询执行过程中,操作符需要重新评估绑定参数的次数。这通常发生在参数或变量的值发生变化时。例如,当一个嵌套循环连接中的外部输入值改变时,可能需要重新绑定内部表的扫描操作。

实际重绕:表示在查询执行过程中,操作符重新使用之前缓存的结果集而不需要重新绑定参数的次数。这通常发生在重复使用相同参数值的情况下。例如,在嵌套循环连接中,如果外部输入值没有变化,内部表的扫描结果可以被重用,而不是重新评估。



使用 Transact-SQL (T-SQL) 展现的文本形式的执行计划

T-SQL(Transact-SQL)是一种用于 Microsoft SQL Server 和 Sybase SQL Server 的特定于厂商的 SQL 方言。它是在标准 SQL(Structured Query Language)基础上进行了扩展和改进,提供了丰富的功能和语法,用于开发存储过程、触发器、函数以及执行各种数据库操作。

sql命令:SET SHOWPLAN_TEXT ON

SQL执行计划_SQL_07

SET SHOWPLAN_ALL ON:这个命令用于生成详细的文本形式的查询执行计划,包括每个操作的成本估算、实际执行的行数等信息。


SET SHOWPLAN_XML ON:这个命令用于生成查询执行计划的

SET STATISTICS PROFILE ON:这个命令用于生成查询的执行统计信息,包括每个操作所花费的时间、读取的行数等。

SQL_STATEMENT:它不是一个具体的

SET STATISTICS PROFILE OFF:是SQL Server中的一个指令,用于关闭查询执行计划的统计分析功能。

区别在于:前三种命令展现结果一样,查询命令和SQL语句是分开的。最后一种命令中:查询命令和SQL语句是一起的。

2、PostgreSQL

sql命令:EXPLAIN

SQL执行计划_执行计划_08

EXPLAIN ANALYZE

SQL执行计划_执行计划_09

规划时间(Planning Time)指的是查询优化器用来考虑各种执行计划选项并选择最佳执行路径所花费的时间。就是执行一个 SQL 查询时,PostgreSQL 的查询优化器会尝试找到最优的查询执行计划,以便高效地检索数据。

执行时间(Execution Time)是指数据库引擎估计执行查询所需的时间。它是优化查询性能的重要指标之一,可以帮助开发人员了解查询的预期性能,并根据需要进行调整和优化查询。