SqlServer的执行计划如何分析?
sqlserver的执行计划
执行计划是 SQL Server 中的一个重要工具,用于分析和优化查询的性能。它提供了关于查询的详细信息,包括查询的执行顺序、使用的索引、连接类型、过滤条件等。
What(什么):执行计划显示了查询的执行计划,即查询的逻辑操作和物理操作。它告诉你查询是如何执行的,包括使用的操作符、数据访问方式等。
Why(为什么):执行计划可以帮助你理解查询的性能问题,例如为什么查询运行缓慢或返回错误结果。通过分析执行计划,你可以找到导致性能问题的原因,例如全表扫描、不合适的索引使用、连接操作类型选择不当等。
Where(在哪里):执行计划可以在 SQL Server Management Studio (SSMS) 中查看。你可以使用 SSMS 打开查询窗口,编写查询语句,并在查询菜单中选择 "显示执行计划",或使用快捷键 Ctrl + M 来启用执行计划。
When(何时):你可以在查询执行之前或之后查看执行计划。在查询执行之前查看执行计划可以帮助你预估查询的性能,并进行必要的优化。在查询执行之后查看执行计划可以帮助你分析查询的实际性能和执行情况。
Who(谁):执行计划可以被数据库管理员、开发人员和性能优化专家使用。数据库管理员可以使用执行计划来监控数据库的性能,并进行必要的调整。开发人员可以使用执行计划来分析查询的性能问题,并进行优化。性能优化专家可以使用执行计划来识别性能瓶颈,并提供优化建议。
How(如何):通过分析执行计划,你可以执行以下操作来优化查询的性能:
检查索引使用情况:执行计划可以显示查询是否使用了索引,以及使用的索引类型。你可以根据执行计划中的索引使用情况,考虑是否需要创建、修改或删除索引来优化查询性能。
检查连接操作的类型:执行计划可以显示连接操作的类型,例如嵌套循环连接、哈希连接等。你可以根据连接类型来判断是否需要优化连接操作。
检查谓词和过滤条件:执行计划可以显示谓词和过滤条件的使用情况。你可以检查谓词和过滤条件是否正确,并根据需要进行优化。
检查排序和分组操作:执行计划可以显示排序和分组操作的使用情况。你可以检查排序和分组操作是否合理,并考虑是否需要优化查询语句或创建相应的索引。
检查实际行数和估计行数:执行计划可以显示实际处理的行数和优化器估计的行数。通过比较实际行数和估计行数,可以判断查询优化器的行数估计是否准确,以及是否存在数据倾斜或其他问题。
这些分析方法可以帮助你理解和优化 SQL Server 的执行计划,以提高查询的性能。请注意,执行计划只是一个指导性的工具,实际的性能优化需要结合具体的数据库结构、数据量和查询条件进行综合分析和测试。
执行计划的常见术语
Operator(操作符):执行计划中的每个节点都对应一个操作符,表示执行的具体操作。常见的操作符包括 Table Scan(全表扫描)、Index Scan(索引扫描)、Index Seek(索引查找)、Nested Loops(嵌套循环连接)、Hash Match(哈希连接)等。
Estimated Number of Rows(估计行数):表示查询优化器对于每个操作符估计的输出行数。这个值是根据统计信息和查询条件进行估计的,用于优化查询计划。
Actual Number of Rows(实际行数):表示查询在执行过程中实际处理的行数。这个值是根据查询的实际执行情况得出的,用于评估查询的性能和准确性。
Estimated Execution Cost(估计执行成本):表示查询优化器对于每个操作符估计的执行成本。这个值是根据统计信息、查询条件和操作符的特性进行估计的,用于优化查询计划。
Actual Execution Mode(实际执行模式):表示查询在执行过程中实际使用的执行模式。常见的执行模式包括 Row Mode(逐行处理)和 Batch Mode(批量处理)。
Predicate(谓词):表示查询的过滤条件。执行计划中的每个操作符都可以有一个或多个谓词,用于过滤数据。
Join Type(连接类型):表示连接操作的类型。常见的连接类型包括 Nested Loops(嵌套循环连接)、Hash Match(哈希连接)、Merge Join(合并连接)等。
Access Type(访问类型):表示数据访问的方式。常见的访问类型包括 Table Scan(全表扫描)、Index Scan(索引扫描)、Index Seek(索引查找)等。
Index Usage(索引使用情况):表示查询是否使用了索引以及使用的索引类型。常见的索引使用情况包括 Clustered Index Scan(聚集索引扫描)、Nonclustered Index Seek(非聚集索引查找)等。
Parallelism(并行处理):表示查询是否使用了并行处理。如果执行计划中的操作符带有 Parallelism 标志,表示该操作符可以并行执行。
这些术语在执行计划中经常出现,了解它们的含义可以帮助你更好地理解和分析查询的执行计划。需要注意的是,实际的执行计划可能会根据查询的复杂性和查询优化器的版本而有所不同。
Sql语句与对应的执行计划术语
SQL 语句和对应的执行计划术语之间的对应关系如下:
SELECT 查询:
Table Scan(全表扫描):对应 SQL 语句中的 FROM 子句,用于获取表中的数据。
Index Scan(索引扫描):对应 SQL 语句中的 FROM 子句,使用索引来获取表中的数据。
Filter(过滤器):对应 SQL 语句中的 WHERE 子句,用于根据指定的条件过滤数据。
Compute Scalar(计算标量):对应 SELECT 语句中的计算表达式,用于计算新的列或表达式。
Stream Aggregate(流式聚合):对应 SELECT 语句中的 GROUP BY 子句,用于对数据进行分组聚合操作。
JOIN 查询:
Nested Loops(嵌套循环连接):对应 JOIN 语句中的嵌套循环连接操作,用于根据连接条件从两个表中获取匹配的行。
Hash Match(哈希连接):对应 JOIN 语句中的哈希连接操作,用于根据连接条件从两个表中获取匹配的行。
Merge Join(合并连接):对应 JOIN 语句中的合并连接操作,用于根据连接条件从两个已排序的表中获取匹配的行。
子查询:
Scalar Subquery(标量子查询):对应 SQL 语句中的标量子查询,用于获取单个值的子查询。
Nested Subquery(嵌套子查询):对应 SQL 语句中的嵌套子查询,用于获取多行多列的子查询。
数据操作:
Insert(插入):对应 SQL 语句中的 INSERT INTO 子句,用于向表中插入数据。
Update(更新):对应 SQL 语句中的 UPDATE 子句,用于更新表中的数据。
Delete(删除):对应 SQL 语句中的 DELETE FROM 子句,用于删除表中的数据。
以上只是一些常见的示例,实际的执行计划术语还会根据具体数据库管理系统的实现和查询优化器的算法而有所不同。
下面是 SQL 语句关键字和对应的执行计划术语的表格展示:
| SQL 语句关键字 | 执行计划术语 |
|---|---|
| SELECT | Table Scan/Index Scan |
| WHERE | Filter |
| GROUP BY | Stream Aggregate |
| JOIN | Nested Loops/Hash Match/Merge Join |
| INSERT INTO | Insert |
| UPDATE | Update |
| DELETE FROM | Delete |
| SUBQUERY | Scalar Subquery/Nested Subquery |
希望以上表格对你有所帮助!如果你有任何其他问题,请随时提问。
join查询
当使用 JOIN 查询时,数据库会根据连接条件将两个或多个表中的数据进行关联。这样可以从多个表中获取相关的数据,以满足复杂的查询需求。在执行 JOIN 查询时,数据库会根据数据量、索引情况和查询优化器的算法选择最合适的连接方法。下面是 JOIN 查询中常见的连接方法的详细介绍:
嵌套循环连接(Nested Loops Join):
嵌套循环连接是最基本的连接方法之一,它通过嵌套循环的方式将两个表中的数据进行匹配。
在执行嵌套循环连接时,数据库会选择一个表作为外部表,然后遍历外部表的每一行,对于每一行,再遍历内部表的每一行,查找满足连接条件的匹配行。
嵌套循环连接适用于其中一个表的数据量较小,或者连接条件能够通过索引快速定位匹配行的情况。
哈希连接(Hash Join):
哈希连接是一种高效的连接方法,它使用哈希算法将两个表中的数据进行分区,并在每个分区中进行匹配。
在执行哈希连接时,数据库会选择一个表作为构建哈希表的表,将该表的数据按照连接条件进行哈希分区,然后遍历另一个表的数据,对于每一行,使用哈希算法在哈希表中查找匹配的行。
哈希连接适用于两个表的数据量较大,并且连接条件不能通过索引快速定位匹配行的情况。
合并连接(Merge Join):
合并连接是一种基于有序数据的连接方法,它要求两个表都按照连接条件进行排序。
在执行合并连接时,数据库会对两个表的数据进行排序,并使用两个指针分别指向两个表的排序结果,然后按照连接条件逐个比较两个指针所指向的行,并获取匹配的结果。
合并连接适用于两个表的数据已经按照连接条件进行了排序的情况,可以有效地减少数据的比较次数。
子查询
以下是几个常见的子查询示例:
1. 标量子查询的示例:
- 获取某个表中的最大值:
```sql
SELECT MAX(column_name) FROM table_name;
```
- 获取满足条件的单个值:
```sql
SELECT column_name FROM table_name WHERE column_name = (SELECT MAX(column_name) FROM table_name);
```
2. 嵌套子查询的示例:
- 使用子查询过滤结果:
```sql
SELECT column_name FROM table_name WHERE column_name IN (SELECT column_name FROM another_table WHERE condition);
```
- 使用子查询进行连接操作:
```sql
SELECT column_name FROM table_name1 INNER JOIN table_name2 ON table_name1.column_name = (SELECT column_name FROM table_name2 WHERE condition);
```
- 使用子查询进行聚合操作:
```sql
SELECT column_name, (SELECT COUNT(*) FROM table_name WHERE condition) AS count FROM table_name2;
```
执行计划的优化改进
在分析 SQL 执行计划结果后,可以采取一些优化原则来改进查询性能和优化执行计划。以下是一些常见的优化原则:
减少全表扫描:全表扫描是指查询没有使用索引,而是扫描整个表的每一行。如果执行计划中存在全表扫描,可以考虑创建适当的索引来加速查询,或者优化查询条件以减少扫描的数据量。
使用合适的索引:执行计划中的索引使用情况可以帮助确定是否需要创建、修改或删除索引。根据查询的过滤条件和连接操作,选择合适的索引类型(聚集索引、非聚集索引、覆盖索引等),以提高查询的性能。
优化连接操作:执行计划中的连接类型可以指导优化连接操作。根据连接操作的类型,考虑是否需要调整连接条件、创建适当的索引、调整连接顺序或使用连接提示来改进连接操作的性能。
消除不必要的排序和分组:执行计划中的排序和分组操作可能会影响查询的性能。如果排序和分组操作不是必需的,可以考虑优化查询语句或创建相应的索引来避免不必要的排序和分组。
优化谓词和过滤条件:执行计划中的谓词和过滤条件可以帮助确定是否需要优化查询条件。根据查询的实际情况,考虑是否需要调整谓词的顺序、使用合适的操作符、使用合适的数据类型或创建适当的索引来优化谓词和过滤条件。
优化查询的统计信息:查询优化器使用统计信息来估计查询的成本和行数。如果执行计划中的估计行数和实际行数相差较大,可以考虑更新统计信息或使用查询提示来改进查询优化器的估计准确性。
避免隐式数据类型转换:执行计划中的数据类型转换可能会影响查询的性能。如果查询中存在隐式数据类型转换,可以考虑使用显式数据类型转换或修改查询语句来避免不必要的数据类型转换。
避免使用函数和表达式:执行计划中的函数和表达式的使用可能会影响查询的性能。如果查询中使用了复杂的函数和表达式,可以考虑优化查询语句或将计算逻辑移至应用程序层面,以减少数据库的计算负载。
使用合适的查询提示:查询提示可以用来指导查询优化器生成更优的执行计划。根据查询的特性和执行计划的分析结果,使用适当的查询提示(如索引提示、连接提示、查询提示等)来改进查询的性能。
需要注意的是,优化执行计划是一个综合性的工作,需要根据具体的查询和数据库环境进行分析和调整。优化原则可以作为指导,但具体的优化策略需要根据实际情况来确定。
SqlServer的执行计划如何分析?的更多相关文章
- SQLServer查询执行计划分析 - 案例
SQLServer查询执行计划分析 - 案例 http://pan.baidu.com/s/1pJ0gLjP 包括学习笔记.书.样例库
- 【MS SQL】通过执行计划来分析SQL性能
原文:[MS SQL]通过执行计划来分析SQL性能 如何知道一句SQL语句的执行效率呢,只知道下面3种: 1.通过SQL语句执行时磁盘的活动量(IO)信息来分析:SET STATISTICS IO O ...
- Sql Server之旅——第十一站 简单说说sqlserver的执行计划
我们知道sql在底层的执行给我们上层人员开了一个窗口,那就是执行计划,有了执行计划之后,我们就清楚了那些烂sql是怎么执行的,这样 就可以方便的找到sql的缺陷和优化点. 一:执行计划生成过程 说到执 ...
- sqlserver的执行计划
一:执行计划生成过程 说到执行计划,首先要知道的是执行计划大概生成的过程,这样就可以做到就心中有数了,下面我画下简图: 1. 分析过程 这三个比较容易理解,首先我们要保证sql的语法不能错误,sele ...
- 看懂MSSQL执行计划,分析SQL语句执行情况
打开SQL执行计划窗口 执行计划的图表是从右向左看的 SQL Server有几种方式查找数据记录 [Table Scan] 表扫描(最慢),对表记录逐行进行检查 [Clustered Index Sc ...
- hive执行计划简单分析
原始SQL: select a2.ISSUE_CODE as ISSUE_CODE, a2.FZQDM as FZQDM, a2.FZQLB as FZQLB, a2.FJJDM as FJJDM, ...
- SQLServer:执行计划
http://www.cnblogs.com/kissdodog/category/532309.html
- 看懂SqlServer执行计划
在园子看到一篇SQLServer关于查询计划的好文,激动啊,特转载.原文出自:http://www.cnblogs.com/fish-li/archive/2011/06/06/2073626.htm ...
- SqlServer 中如何查看某一个Sql语句是复用了执行计划,还是重新生成了执行计划
我们知道SqlServer的查询优化器会将所执行的Sql语句的执行计划作缓存,如果后续查询可以复用缓存中的执行计划,那么SqlServer就会为后续查询复用执行计划而不是重新生成一个新的执行计划,因为 ...
- mysql系列八、mysql数据库优化、慢查询优化、执行计划分析
mysql的性能优化无法一蹴而就,必须一步一步慢慢来,从各个方面进行优化,最终性能就会有大的提升. 一.介绍 对mysql优化是一个综合性的技术,主要包括 表的设计合理化(符合3NF) 添加适当索引( ...
随机推荐
- Collection 接口及其常用方法
Collection 接口的特点 Collection接口没有直接实现类,提供了更具体的子接口(如Set和List)的实现.Collection实现类(通常通过其中一个子接口间接实现Collectio ...
- Dubbo 我手写几行代码,就把通信模式给你解释清楚!
作者:小傅哥 博客:https://bugstack.cn 原文:https://bugstack.cn/md/road-map/road-map.html 沉淀.分享.成长,让自己和他人都能有所收获 ...
- DLL注入-Windows消息钩取
0x01 钩子 钩子,英文Hook,泛指钓取所需东西而使用的一切工具.后来延伸为"偷看或截取信息时所用的手段或工具". 挂钩:为了偷看或截取来往信息而在中间设置岗哨的行为 钩取:偷 ...
- Redis的设计与实现(6)-压缩列表
压缩列表 (ziplist) 是列表键和哈希键的底层实现之一. 当一个列表键只包含少量列表项, 并且每个列表项要么就是小整数值, 要么就是长度比较短的字符串, 那么 Redis 就会使用压缩列表来做列 ...
- Kubernetes亲和性学习笔记
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是欣宸在学习Kubernetes调度器的 ...
- Qt+GDAL开发笔记(二):在windows系统msvc207x64编译GDAL库、搭建开发环境和基础Demo
前言 上一篇使用mingw32版本的gdal,过程曲折,为更好的更方便搭建环境,在windows上msvc方式对于库比较友好. 大地坐标简介 概述 大地坐标(Geodetic coordi ...
- SpringBoot对接OpenAI
SpringBoot对接OpenAI 随着人工智能技术的飞速发展,越来越多的开发者希望将智能功能集成到自己的应用中,以提升用户体验和应用的功能.OpenAI作为一家领先的人工智能公司,提供了许多先进的 ...
- lea指令调用
lea指令(Load Effective Address)在x86汇编语言中的作用是将一个有效地址(即一个内存地址或寄存器地址的偏移量)加载到目标寄存器中,而不是加载一个实际的内存值. lea指令的使 ...
- 7.1 C++ STL 非变易查找算法
C++ STL 中的非变易算法(Non-modifying Algorithms)是指那些不会修改容器内容的算法,是C++提供的一组模板函数,该系列函数不会修改原序列中的数据,而是对数据进行处理.查找 ...
- 给你安利一款带有AI功能的数据库管理工具
写在前面 说到数据库管理工具,大家应该不陌生了 小伙伴们应该都用过Navicat.DBever.DataGrip.SQLyog.plsqldeveloper等数据库管理工具 这些工具呢都各自有优缺点. ...