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

news2024/11/25 20:14:54

学习查询优化器不是我们的目的,而是通过 它,我们掌握 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.coloradmin.cn/o/969902.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数学建模--整数规划匈牙利算法的Python实现

目录 1.算法流程简介 2.算法核心代码 3.算法效果展示 1.算法流程简介 #整数规划模型--匈牙利算法求解 """ 整数规划模型及概念:规划问题的数学模型一般由三个因素构成 决策变量 目标函数 约束条件;线性规划即以线性函数为目标函数&a…

Python开源项目月排行 2023年8月

#2023年8月2023年9月2日1facechain一款可以用于打造个人数字形象的深度学习模型工具。用户只需提供最低三张照片即可获得独属于自己的个人形象数字替身。FaceChain 支持在梯度的界面中使用模型训练和推理能力,也支持资深开发者使用 python 脚本进行训练推理。2Qwen-…

CXL寄存器介绍(3)- CXL MMIO

🔥点击查看精选 CXL 系列文章🔥 🔥点击进入【芯片设计验证】社区,查看更多精彩内容🔥 📢 声明: 🥭 作者主页:【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0c…

【SpringSecurity】六、基于数据库的认证与授权

文章目录 1、数据库表设计2、测试代码准备3、新建安全用户类4、实现UserDetailsService接口5、授权 1、数据库表设计 接下来基于数据库里的用户信息进行登录认证,以RBAC设计表,分别为: 用户表sys_user :除了基本信息外&#xff…

pytorch(b站小土堆学习笔记P1-P15)

P3. Python学习中的两大法宝函数(当然也可以用在PyTorch) import torch#查看pytorch有哪些指令 print(dir(torch)) print(dir(torch.cuda)) #查看每条指令怎么用 help(torch.cuda.is_available) P4. PyCharm及Jupyter使用及对比 P5 dataset和dataloade…

肖sir__设计测试用例方法之场景法04_(黑盒测试)

设计测试用例方法之场景法 1、场景法主要是针对测试场景类型的,顾也称场景流程分析法。 2、流程分析是将软件系统的某个流程看成路径,用路径分析的方法来设计测试用例。根据流程的顺序依次进行组合,使得流程的各个分支能走到。 举例说明&…

Pinely Round 2 (Div. 1 + Div. 2) F. Divide, XOR, and Conquer(区间dp)

题目 给定长为n(n<1e4)的数组&#xff0c;第i个数为ai(0<ai<2的60次方) 初始时&#xff0c;区间为[1,n]&#xff0c;也即l1&#xff0c;rn&#xff0c; 你可以在[l,r)中指定一个k&#xff0c;将区间分成左半边[l,k]、右半边[k1,r] 1. 如果左半边异或和与异或和的异…

肖sir__设计测试用例方法之判定表06_(黑盒测试)

设计测试用例方法之判定表 1、判定表&#xff1a;是一种表达逻辑判断的工具。 2、判定表&#xff1a;包含四部分 1&#xff09;条件桩&#xff08;condition stub&#xff09;:列出问题的 所有条件&#xff08;通常条件次序无关紧要&#xff09;。 2&#xff09;条件项&#x…

面试官:介绍一下CSS定位?absolute和relative分别依据什么定位?

能说服一个人的&#xff0c;从来不是道理&#xff0c;而是南墙。 一、position属性介绍 取值名称效果static静态定位(默认值)元素按照标准流布局 (不脱标) , top、bottom、left 、right等属性不起作用relative相对定位元素按照标准流布局 (不脱标) &#xff0c;可以通过top、b…

Medium:做AB test需要多少时间?

文章链接&#xff1a;https://medium.com/alfredcamera/%E5%81%9A-ab-test-%E9%9C%80%E8%A6%81%E5%A4%9A%E5%B0%91%E6%99%82%E9%96%93-c401fbe00eb0 其中&#xff0c;最关键的是确定&#xff1a;总共需要多少样本数量。由以下2个指标决定&#xff1a; 由工具得到&#xff1a; 特…

监听器Listener -,钝化,活化,利用监听器实现简易版 统计网站在线用户功能

监听绑定到HttpSession域中某个对象状态 1.HttpSessionBindingListener 实体类 package com.etime.enetity;import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionBindingListener;//此处需要实现HttpSessionBindingListener接口&…

使用MDK5的一些偏僻使用方法和谋个功能的作用

程序下载后无法运行 需要勾选如下库&#xff0c;是优化后的库&#xff1b; MicroLib和标准C库之间的主要区别是: 1、MicroLib是专为深度嵌入式应用程序而设计的。 2、MicroLib经过优化&#xff0c;比使用ARM标准库使用更少的代码和数据内存。 3、MicroLib被设计成在没有操作…

科技成果鉴定之鉴定测试报告

鉴定测试 由于软件类科技成果的复杂、内部结构难以鉴别等特点&#xff0c;我们提供了软件类科技成果鉴定测试服务。软件类科技成果鉴定测试是依据其科研项目计划任务书或技术合同书&#xff0c;参照相应的国家标准对要申请鉴定的软件类科技成果进行的一种符合性测试&#xff0…

【100天精通Python】Day51:Python 数据分析_数据分析入门基础与Anaconda 环境搭建

目录 1 科学计算和数据分析概述 2. 数据收集和准备 2.1 数据收集 2.1.1 文件导入&#xff1a; 2.1.2 数据库连接&#xff1a; 2.1.3 API请求&#xff1a; 2.1.4 网络爬虫&#xff1a; 2.2 数据清洗 2.2.1 处理缺失值&#xff1a; 2.2.2 去除重复值&#xff1a; 2.2…

数学建模--Python绘图

目录 1.绘制散点图 1.1.绘制过程解释 1.2.绘制图像代码 1.3.绘制图像展示 2.绘制折线统计图 2.1.绘制过程解释 2.2.绘制图像代码 2.3.绘制图像展示 3.绘制柱形图 3.1.绘制图像解释 3.2.绘制图像代码 3.3.绘制图像展示 4.多种图形的综合绘制 4.1.绘制图像解释 4.2.绘制图像…

二级web操作题(1-6)

第二套 1.对数组排序 <html> <title>对数组排序</title> <body> <script> //生成一个m、n之间的整数 function rand(m,n){ /* **********Found********** */ var iMath.random(); /* **********Found********** */ return Math.round((n-m…

内存管理之:内存空间分布和栈攻击(黑客常用攻击手段)

目录 C语言内存管理及栈攻击 内存管理 Linux虚拟内存空间分布&#xff08;重要&#xff09; 栈溢出&#xff08;栈攻击&#xff09; 堆栈的特点 栈攻击 栈攻击的实现 原理 编译器选项 实现案例 linux修改栈空间大小方式 内存泄漏 如何避免野指针&#xff1f; 如何…

C++智能指针之weak_ptr(保姆级教学)

目录 C智能指针之weak_ptr 概述 作用 本文涉及的所有程序 使用说明 weak_ptr的常规操作 lock(); use_count(); expired(); reset(); shared_ptr & weak_ptr 尺寸 智能指针结构框架 常见使用问题 shared_ptr多次引用同一数据&#xff0c;会导致两次释放同一内…

Medium:How to check the correctness of the AB test?

有以下两种错误&#xff1a; 通常&#xff0c;type 1 error is more important&#xff01;因此我们type 2 error就是在“委曲求全”&#xff1a; The probability of Type II error can be adjusted to the desired value by changing the size of the groups or by reducing…

【LeetCode每日一题合集】2023.8.14-2023.8.20(⭐切披萨3n块披萨)

文章目录 617. 合并二叉树833. 字符串中的查找与替换&#xff08;模拟&#xff09;2682. 找出转圈游戏输家&#xff08;模拟&#xff09;1444. 切披萨的方案数&#xff08;⭐⭐⭐⭐⭐&#xff09;解法——从递归到递推到优化&#xff08;二维前缀和记忆化搜索&#xff09; 1388…