理解执行计划

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:

为什么会有执行计划

很多人经常问我在SQL Server里为什么需要执行计划。我们已经有了SQL Server的查询,但为什么SQL Server还需要执行计划呢?为什么SQL Server不自己执行查询呢?为了回答那个问题,我们需要进一步讨论下SQL语言。SQL语言(在SQL Server也叫做T-SQL)是一个解释性的语言(declarative language) 。你用一种逻辑的方式介绍从你数据库想要的数据(SELECT查询),或者在你数据里你想要修改的数据(INSERT, UPDATE, DELETE查询)。就看下下面的查询。

1 SELECT A.*, B.* FROM A
2 INNER JOIN B ON A.ID = B.ID
3 WHERE A.X = 'SomeValue'

在那个查询里,你告诉数据库:

  1. 你想要从表A和表B获取数据
  2. 2个表需要通过ID列进行连接
  3. 表A里的行需要在X列上进行过滤

你通过SQL语句来描述数据库的查询结果是什么样的。用SQL语句你只指出结果,没其他任何信息。你没有告诉SQL Server如何执行这个查询,即获取数据的流程。

你总是和SQL Server以逻辑的方式打交道,描述下你想要获取的数据,或者你想要修改的数据。但是SQL Server本身是需要一个实际执行计划来描述如何获取或修改数据的步骤。这个执行计划就是被称为查询优化器(Query Optimizer)拿来处理你SQL查询的策略

这是我们现实生活的华丽重现:想下你要从一个城市到另一个城市旅游。例如你想从伦敦到巴黎旅游,你就定义了一个逻辑描述。当然,那个逻辑描述可以有多个实现方式:

  • 你可以从伦敦走到巴黎
  • 你可以骑车过去
  • 你可以坐汽车/火车/飞机

选择哪个并不重要,其实这里有很多不同的组合方式。你的旅行方式就会非常多。你肯定会选择成本关联最低的方式:坐飞机直达。在SQL Server里的查询优化器也做着同样的工作:查询优化器会选择满足你查询最省力的执行计划。对于查询优化器的挑战就是:从查找空间(Search Space)里,找到足够好(good enough)的执行计划!查找空间就是在你查询里涉及到的大量表和索引。

如何阅读执行计划

第一次接触到执行计划时,你会碰到很多困难:你不能正确理解和读懂它们。来看下下面的执行计划:

从上图可以看到,每个执行计划包含很多步,在SQL Server里被称为运算符(Operator) 。这些运算符被SQL Server逐个调用。这就是说在执行计划里,运算符的执行流是从右到左的(从上到下)。

这里的SQL Server执行的第一步是:在Address表上的索引查找(非聚集索引)(Index Seek(Non Clustered))运算符。从扫描回来的每条记录进入嵌套循环(Nested Loop)运算符。对于获取的每条记录,SQL Server在Address表进行了键查找(聚集索引)(Key Lookup (Clustered) 运算符(一种书签查找)。如果有匹配的行,这行就会传给SELECT运算符,即把最终结果返回给程序。

从上面的描述,我们可以看到,刚开始阅读执行计划时,从右往左更容易,因为在执行计划里,数据也是这样流的。执行计划实际上也是从右往左执行的。当我们从右到左跟着数据时,我们是在一种逻辑的方式阅读执行计划。

希望这种方式可以更好的帮你理解如何读懂执行计划。如果你想看看在SQL Server里,执行计划支持哪些运算符,我推荐Fabiano Amorim的免费电子书《Complete Showplan Operators (PDF)》。

小结

这期的性能调优培训,我们弄清楚了SQL Server为什么需要执行计划,还有如何读懂执行计划。如你所看到的,我们和SQL Server是以逻辑的方式打交道:我们通过SQL查询描述数据库里我们想要的数据,或者我们想要修改的数据。


本文转自Woodytu博客园博客,原文链接:http://www.cnblogs.com/woodytu/p/4535099.html,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
7月前
|
存储 关系型数据库 MySQL
MySQL查询执行计划详解(EXPLAIN)
一、单表查询 访问方法/访问类型: • const:通过主键值或唯一二级索引与一个常熟进行等值查询(不包括NULL),只会生成一条记录 • ref:普通二级索引与一个常数进行等值比较,可能生成多条记录 • ref_or_null:ref的前提下可以加上or key is null • range:对应的扫描区间为若干个单点扫描区间或范围扫描区间(不包括负无穷到正无穷的范围) • index:扫描区间为全表,但是可以在二级索引中扫描(因为二级索引每条记录占用空间更小,所以需要读的页更少) • all:直接扫描全部的聚集索引记录
|
SQL 存储 Oracle
一次搞定各种数据库SQL执行计划
执行计划(execution plan,也叫查询计划或者解释计划)是数据库执行 SQL 语句的具体步骤,例如通过索引还是全表扫描访问表中的数据,连接查询的实现方式和连接的顺序等。如果 SQL 语句性能不够理想,我们首先应该查看它的执行计划。
一次搞定各种数据库SQL执行计划
|
NoSQL MongoDB 开发者
索引的使用 执行计划 | 学习笔记
快速学习 索引的使用 执行计划
索引的使用 执行计划 | 学习笔记
|
SQL 存储 关系型数据库
几个必须掌握的SQL优化技巧(三):Explain分析执行计划
在应用的开发过程中,由于开发初期的数据量一般都比较小,所以开发过程中一般都比较注重功能上的实现,但是当完成了一个应用或者系统之后,随着生产数据量的急剧增长,那么之前的很多sql语句的写法就会显现出一定的性能问题,对生产的影响也会越来越大,这些不恰当的sql语句就会成为整个系统性能的瓶颈,为了追求系统的极致性能,必须要对它们进行优化。
299 0
几个必须掌握的SQL优化技巧(三):Explain分析执行计划
|
SQL 索引 存储
执行计划的生成
原文:执行计划的生成   SQL Server使用许多技术来优化资源消耗: 基于语法的查询优化; 无用计划匹配以避免对简单查询的深度优化; 根据当前分布统计的索引和连接策略; 多阶段的查询优化以控制优化开销; 执行计划缓冲以避免重新生成执行计划;   以上技术按以下顺序执行: 解析器; 代数化器; 查询优化器; 执行计划生成,缓冲和hash计划生成; 查询执行;   其执行顺序如下:    一、解析器(parser)   当查询被提交时,SQL Server将它传递给关系引擎中的解析器。
1137 0
|
SQL 关系型数据库 MySQL
sql优化——explain
sql优化——explain http://www.bieryun.com/3431.html 利用explain可以得到sql的执行计划,是查询性能优化不可缺少的一部分。 explain得到的列明解释: id: 用来标识select语句的,id越大越先执行。
1544 0