查询优化器内核剖析之从一个实例看执行计划

学习查询优化器不是我们的目的,而是通过 它,我们掌握 SQL Server 是如何处理我们的 SQL 的,掌握执行计划,掌握为什么产生 I/O 问题, 为什么 CPU 使用老高,为什么你的索引加了不起作用...

如果,我告诉你,你去加个索引,换 SAN 存储,这样意义不大!数据库优化就是这样的: 没有所谓的“绝对手段,一下子把性能搞上去,一切都是看情况而定”,都是通过不断的分析, 抽丝剥解。不带头脑的优化,能好到那里去?

在前几篇文章中,我们已经谈了一些查询优化器的相关的基础介绍,也大致的了解了它到 底是干什么的。查询优化器的结果就是产生执行计划,执行计划就是一个树,这个树由很多的物 理操作组成,而这些物理操作就定义了如何去存储设备中去获取数据。

我们可以以很多的不同的方式,例如图形化,文本,XML 的形式来查看一个给定查询的实 际的执行计划和估计的执行计划。这些不同格式的执行计划的区别主要在于包含的信息的详细程 度不同。

当需要查看一个查询的实际的执行计划的时候,这个查询比较要执行。然而,如果查看估 计的执行计划,此时整个查询是不需要实际执行的。如果查询是个需要消耗很长时间,很多资源 的查询,我们在分析问题的时候,会先查看这个查询估计的执行计划,并且这样做也不会对使用 数据库的其他用户产生影响。

查看实际执行计划和估计的执行计划方式有很多,最简单的方式就是在 SQL Server 管理界 面点击如下按钮:

查看估计的执行计划:

查看实际的执行计划:

 下面,我们就来通过一个简单的示例讲述执行计划,这里采用示例数据库:

我们在 SQL Server 中输入以下查询:

然后,点击“Include Actual Execution Plan”按钮,然后执行 SQL 语句,看到如下显示:

 

在图中,我们可以看到一些物理操作符号以图标显示,例如 Index Scan,Hash Aggregate。 第一个图标称为结果操作符,它返回了查询的结果。

每一个物理的操作符,其实就是存储引擎中实现的一些基本的操作或者方法。例如,一个 逻辑的 join(就是我们在 SQL 写的 inner join 之类的),可以再执行计划中以不同的物理 join 操作 实现(Nested Loops Join, Merge Join, Hash Join)。当然,这里没有所谓的“那种物理操作好,哪 种不好”,得看具体情况。

每个物理操作执行的时候,就会去获取一些数据,然后将数据传递给它下一个物理操作, 知道全部的操作完成,返回结果。在查看执行计划的时候,需要“从右向左,从下到上”进行。

在执行计划中,每个物理操作都有一些“箭头”相连,这些箭头就表明了执行的先后顺序, 并且箭头的粗细也放映了传递数据的多少,越粗就表明数据越多。 我们可以通过把鼠标放在这些 箭头上面,查看更多的信息。如下:

通过查看提示信息,我们可以知道:Index Scan 这个操作读取了 19614 条数据,这些数据 之后被传递给了Hash Aggregate操作。Hash Aggregate执行之后,就将这些数据通过City字段做 了一个 distinct 的处理,将 575 条数据给了下一个操作:

 

对于执行计划中出现的一些物理操作,一般基本会通过三个方法来实现它们的功能(这里 要把操作和方法的概念搞清楚,可能在很多的编程语言中,一个操作就是一个方法,或者说操作 就是方法,这里的操作和方法和那些不同,一个操作是有几个方法来实现和完成的,为了便于理解, 大家这里就把每一个操作理解为一个类吧):

Open()方法:这个方法初始化一个物理操作 GetRow()方法:这个方法每次都从它的上一个操作中获取一行数据 Close()方法:执行完毕,做一些相关的清理等工作

因为 GetRow()方法每次只能从上一个操作中获取一个数据,那么如果上一个操作传递了很 多的数据,那么这个物理操作就要多次调用上一个操作的 GetRow()方。在上面的例子中,Hash Aggregate 操作只调用一次 Index Scan 的 Open()方法,然后调用 19615 次 Index Scan 的 GetRow()方 法,最后调用一次 Index Scan 的 Close()方法。

其实我们还可以通过这个图形化的执行计划得到更多的信息!为了使得大家更好地消化今 天的知识,余下的内容,下次接着讲述。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/119647.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3DCAT携手华为,打造XR虚拟仿真实训实时云渲染解决方案

2023年5月8日-9日,以 因聚而生 众志有为 为主题的 华为中国合作伙伴大会2023 在深圳国际会展中心隆重举行。本次大会汇聚了ICT产业界的广大新老伙伴朋友,共同探讨数字化转型的新机遇,共享数字化未来的新成果。 华为中国合作伙伴大会2023现场&…

安装ArcGis时需要安装Micsoft.Net Framework 3.5 sp1

在安转ArcGis时遇到一个问题,解决方法如下 下载.Net 按照他的说明 将地址复制到迅雷中下载,并安装 就可以了 安装就可以了

【数据结构-队列】队列介绍

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

cms系统稳定性压力测试出现TPS抖动和毛刺的性能bug【杭州多测师_王sir】

一、并发线程数100,分10个阶梯,60秒加载时间,运行1小时进行压测,到10分钟就出现如下 二、通过jstat -gcutil 16689 1000进行监控

49、IDEA 创建类或方法时,实现按格式化 ctrl + alt + l 能变成左花括号在下一行,与右花括号对齐

IDEA 创建类或方法时,左花括号是改成在下一行,与右花括号对齐 默认花括号是这样的 现在想改成这样的 实现按格式化 ctrl alt l 能变成这样 在这里修改就行 把 end of line 改成 next line

学习高级数据结构:探索平衡树与图的高级算法

文章目录 1. 平衡树:维护数据的平衡与高效性1.1 AVL 树:严格的平衡1.2 红黑树:近似平衡 2. 图的高级算法:建模复杂关系与优化2.1 最小生成树:寻找最优连接方式2.2 拓扑排序:解决依赖关系 拓展思考 &#x1…

任意文件读取和漏洞复现

任意文件读取 1. 概述 一些网站的需求,可能会提供文件查看与下载的功能。如果对用户查看或下载的文件没有限制或者限制绕过,就可以查看或下载任意文件。这些文件可以是漂代码文件,配置文件,敏感文件等等。 任意文件读取会造成&…

生信分析Python实战练习 5 | 视频23

开源生信 Python教程 生信专用简明 Python 文字和视频教程 源码在:https://github.com/Tong-Chen/Bioinfo_course_python 目录 背景介绍 编程开篇为什么学习Python如何安装Python如何运行Python命令和脚本使用什么编辑器写Python脚本Python程序事例Python基本语法 数…

IP对讲终端SV-6005带一路2×15W或1*30W立体声做广播使用

IP对讲终端SV-6005双按键是一款采用了ARMDSP架构,接收网络音频流,实时解码播放;配置了麦克风输入和扬声器输出,SV-6005带两路寻呼按键,可实现对讲、广播等功能,作为网络数字广播的播放终端,主要…

计算机视觉-YOYO-

目录 计算机视觉-YOYO 目标检测发展历程 区域卷积神经网络(R-CNN) Fast R-CNN Mask R-CNN模型 比如SSD、YOLO(1, 2, 3)、R-FCN 目标检测基础概念 边界框、锚框和交并比 边界框(bounding box) 锚框(Anchor box) 交并比 …

【传输层】TCP -- 三次握手四次挥手 | 可靠性与提高性能策略

超时重传机制连接管理机制三次握手四次挥手滑动窗口拥塞控制延迟应答捎带应答面向字节流粘包问题TCP异常情况TCP小结基于TCP应用层协议理解 listen 的第二个参数 超时重传机制 主机A发送数据给B之后,可能因为网络拥堵等原因,数据无法到达主机B&#xff1…

IDEA使用Docker插件

修改Docker配置 1.执行命令vim /usr/lib/systemd/system/docker.service,在ExecStart配置的后面追加 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock -H tcp://0.0.0.0:…

如何开立香港银行账户?

作为国际金融中xin,香港拥有众多世界知名的银行机构,提供了丰富的金融服务和产品。那么,开立香港银行账户需要哪些资料?具体流程和时间又是怎样的呢? 一、所需资料 开立香港银行账户所需的基本资料如下: …

国标GB28181视频平台EasyGBS国标平台智能边缘计算网关关于小区电动车进电梯的应用方案设计

一、行业背景 随着人工智能技术的不断成熟与落地,各行各业也逐渐融入AI智能检测技术,尤其是在视频监控领域,通过AI视频智能检测与分析,可以大大提高视频的自动化、智能化监控能力。比如在小区的管理中,由电动车上楼入…

大数据、AI和云原生:引领未来软件开发的技术演进

文章目录 **1. 数据驱动的创新:****2. 智能化应用的兴起:****3. 云原生的敏捷和可扩展性:****4. 实时性和即时性:****5. 数据隐私和安全:****6. 跨平台和跨设备:****7. 自动化和智能编程:****8.…

化繁为简,使用Hibernate Validator实现参数校验(一)

目录 前言 环境配置 导入依赖 基础校验 校验注解 参数绑定 PathVariable RequestParam RequestBody Validated Valid 单参校验 对象校验 分组校验 顺序校验 前言 在之前的悦享校园的开发中使用了SSM框架,由于当时并没有使用参数参数校验工具&#xf…

【核磁共振成像】观共享重建

目录 一、K空间关键孔技术-数据采集二、BRISK技术三、TRICKS技术四、实时成像和滑动窗重建五、心电触发电影(CINE)采集六、分段心脏采集和观共享 一、K空间关键孔技术-数据采集 对于笛卡尔K空间,一个相位编码行有时称为一个K空间观。一般情况下,每帧图像…

Java异常(Error与Exception)与常见异常处理——第八讲

前言 前面我们讲解了Java的基础语法以及面向对象的思想,相信大家已经基本掌握了Java的基本编程。在之前代码中,我们也看到代码写错了编译器会提示报错,或者编译器没有提示,但是运行的时候报错了,比如前面的数组查询下标超过数组的长度。所以在使用计算机语言进行项目开发的…

电脑前置耳机没声音怎么办

有很多小伙伴反映在将自己的耳机连接到主机前面时没有声音,这是怎么回事呢,遇到这种情况应该怎么解决呢,下面小编就给大家详细介绍一下电脑前置耳机没声音的解决方法,有需要的小伙伴可以来看一看电脑前面耳机没声音。 解决方法&a…

一图胜千言!数据可视化多维讲解(Python)

数据聚合、汇总和可视化是支撑数据分析领域的三大支柱。长久以来,数据可视化都是一个强有力的工具,被业界广泛使用,却受限于 2 维。在本文中,作者将探索一些有效的多维数据可视化策略(范围从 1 维到 6 维)。…