Sql Server之旅——第十站 简单说说sqlserver的执行计划

我们知道sql在底层的执行给我们上层人员开了一个窗口,那就是执行计划,有了执行计划之后,我们就清楚了那些烂sql是怎么执行的,这样 就可以方便的找到sql的缺陷和优化点。

一:执行计划生成过程

   说到执行计划,首先要知道的是执行计划大概生成的过程,这样就可以做到就心中有数了,下面我画下简图:

1. 分析过程

这三个比较容易理解,首先我们要保证sql的语法不能错误,select和join的表是必须存在的,以及你是有执行这个sql的权限,对不对。。。这样我们就走完了执行计划生命周期的第一个流程。

2. 编译过程

保证了上面sql这三点的话,引擎就必须硬着头皮看你这么一大坨烂sql,该删的删,该改的改,该转换的转换,比如说你的“子查询”会转化为 “表连接”等等。。。其实也挺难为引擎的,举个例子吧。

<1>子查询生成的sql:

<2>join生成的sql:

从上面的两个结果中,你可以看到,大家都是玩join的,如果你仔细看的话,会发现一个是“哈希匹配”,一个是“嵌套循环”,为什么不一样,这当然是引擎根据很多情况综合评选出来的,比如说:磁盘IO,逻辑读,资源占用,硬件环境等等。。。这也是所谓的“计划选优”操作。

3.执行过程

既然执行计划都选出来了,理所当然就要执行了,执行完后会把sql和执行计划放入缓存,这样下次有同样的sql过来的时候就可以直接从 Cache中提取了,不需要再次生成计划了,你也看到,生成执行计划还是比较消耗CPU时间的。

二:看看sql和执行的计划的缓存

刚才也说了,sql和plan都已经放入缓存了,那我的好奇心比较强,我就想看看sql和plan到底在哪,并且长的是个什么样子。

1. 为了方便查看缓存,我需要先将所有的缓存清空,比如下面的语句。


DBCC freeproccache
SELECT c.* FROM dbo.Category AS c
JOIN dbo.Product AS p
ON c.CategoryId=p.CategoryId
WHERE c.CategoryId=23794

2. 通过sys.dm_exec_cached_plans拿到sql和plan的指针(plan_handle),如下图


SELECT * FROM sys.dm_exec_cached_plans

从图中你看到了两个adhoc(即时查询),分别是我在第一步执行的join查询和我在第二步执行的这个select。

3. 现在我们已经拿到了2个adhoc的plan_handle,然后通过dm_exec_sql_text查看他们的sql分别是怎样?

4. 看完text缓存,接下来我们继续看看sql的plan缓存在哪?可以通过dm_exec_query_plan来查看。

上面的query_plan字段就是所谓的执行计划,以xml的形式保存在字段中。。。所以说解析这个xml还是很费时间的。。。

好了,到现在你应该认识到重新生成执行计划是不容易的。。。下一篇我们讨论讨论重用,重编译,重新生成等相关情况。

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

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

相关文章

【半译】扩展shutdown超时设置以保证IHostedService正常关闭

我最近发现一个问题&#xff0c;当应用程序关闭时&#xff0c;我们的应用程序没有正确执行在IHostedService中的StopAsync方法。经过反复验证发现&#xff0c;这是由于某些服务对关闭信号做出响应所需的时间太长导致的。在这篇文章中&#xff0c;我将展示出现这个问题的一个示例…

java基础知识——基础语法

java的基本语法格式 [修饰符] class 类名{程序代码 }方法的定义 一般情况下&#xff0c;定义一个方法包含以下语法&#xff1a; 修饰符 返回值类型 方法名(参数类型 参数名){...方法体...return 返回值; }JAVA标识符规范&#xff1a; 1.标识符可以由任意顺序的大小写字母、…

[JavaWeb-MySQL]多表关系介绍

多表之间的关系 1. 分类&#xff1a;1. 一对一(了解)&#xff1a;* 如&#xff1a;人和身份证* 分析&#xff1a;一个人只有一个身份证&#xff0c;一个身份证只能对应一个人2. 一对多(多对一)&#xff1a;* 如&#xff1a;部门和员工* 分析&#xff1a;一个部门有多个员工&am…

Asp.Net Core多榜逆袭,这是.NET最好的时代!

摒弃侥幸之念&#xff0c;必取百炼成钢。厚积分秒之功&#xff0c;始得一鸣惊人&#xff01;经过多年的沉沦&#xff0c;.NET终于迎来逆袭&#xff01;近期连出多个排行榜&#xff0c;Asp.Net Core直接霸榜&#xff0c;这意味着属于.Neter的好时代的即将到来&#xff01;.Net C…

[JavaWeb-MySQL]数据库的备份和还原

数据库的备份和还原 1. 命令行&#xff1a;* 语法&#xff1a;* 备份&#xff1a; mysqldump -u用户名 -p密码 数据库名称 > 保存的路径* 还原&#xff1a;1. 登录数据库2. 创建数据库3. 使用数据库4. 执行文件。source 文件路径 2. 图形化工具&#xff1a;备份完成!!! 现…

SiteServer CMS 新版本 V6.15(2020年6月1日发布)

欢迎来到 SiteServer CMS V6.15版本&#xff0c;新版本重点增加了 REST API 的接口调用&#xff0c;同时修复了多项BUG:REST API 接口增强&#xff1a;通过REST API&#xff0c;第三方系统可以很好地集成 SiteServer CMS&#xff0c;以下是最新的API接口&#xff0c;涵盖了CMS操…

JAVA中小细节(易忽视和易错点)

在为一个long类型的变量赋值时&#xff0c;所赋值的后面要加上一个字母L&#xff08;l&#xff09;&#xff0c;说明赋值为long类型&#xff0c;但如果赋值未超出int取值范围&#xff0c;可以忽略。在为一个float类型的变量赋值时&#xff0c;所赋值的后面要加上一个字F&#x…

[JavaWeb-MySQL]多表查询(内连接,外连接,子查询)

多表查询的分类&#xff1a; 1. 内连接查询&#xff1a;1. 隐式内连接&#xff1a;使用where条件消除无用数据* 例子&#xff1a;-- 查询所有员工信息和对应的部门信息SELECT * FROM emp,dept WHERE emp.dept_id dept.id;-- 查询员工表的名称&#xff0c;性别。部门表的名称SE…

全局变量初始化顺序探究

缘起 我在上一篇文章——《调试实战 —— dll 加载失败之全局变量初始化篇》中&#xff0c;跟大家分享了一个由于全局变量初始化顺序导致的 dll 加载失败的例子。感兴趣的小伙伴儿可以点击阅读。虽然我们知道了是由于全局变量初始化顺序导致的问题&#xff0c;也给出了解决方案…

java基础知识——面向对象基本概念

文章目录Java基本概念源文件声明规则Java包Import语句继承类型继承的特性继承关键字super 与 this 关键字构造器方法的重写规则重载(Overload)重写与重载之间的区别java 接口接口与类相似点&#xff1a;接口与类的区别&#xff1a;接口特性抽象类和接口的区别接口的声明接口的实…

[JavaWeb-MySQL]多表查询练习

-- 部门表 CREATE TABLE dept (id INT PRIMARY KEY PRIMARY KEY, -- 部门iddname VARCHAR(50), -- 部门名称loc VARCHAR(50) -- 部门所在地 );-- 添加4个部门 INSERT INTO dept(id,dname,loc) VALUES (10,教研部,北京), (20,学工部,上海), (30,销售部,广州), (40,财务部,深圳)…

基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(三)

上一篇完成了全网各大平台的热点新闻数据的抓取&#xff0c;本篇继续围绕抓取完成后的操作做一个提醒。当每次抓取完数据后&#xff0c;自动发送邮件进行提醒。在开始正题之前还是先玩一玩之前的说到却没有用到的一个库PuppeteerSharp。PuppeteerSharp&#xff1a;Headless Chr…

创建型模式——工厂模式

一、 实验目的与要求 1.练习使用工厂模式。设计相关的模拟场景并进行实施&#xff0c;验证模式特性&#xff0c;掌握其优缺点。 2.实验结束后&#xff0c;对相关内容进行总结。 二、实验内容 1.模式应用场景说明 作为一个青年人&#xff0c;最好的伙伴就是手机。而手机最重…

[JavaWeb-MySQL]事务的基本介绍

事务的基本介绍 1. 概念&#xff1a;* 如果一个包含多个步骤的业务操作&#xff0c;被事务管理&#xff0c;那么这些操作要么同时成功&#xff0c;要么同时失败。2. 操作&#xff1a;1. 开启事务&#xff1a; start transaction;2. 回滚&#xff1a;rollback;3. 提交&#xff…

dotNET Core 3.X 依赖注入

如果说在之前的 dotNET 版本中&#xff0c;依赖注入还是个比较新鲜的东西&#xff0c;那么在 dotNET Core 中已经是随处可见了&#xff0c;可以说整个 dotNET Core 的框架是构建在依赖注入框架之上。本文说说对 dotNET Core 中依赖注入的理解。什么是依赖在面向对象的语言中&am…

创建型模式——抽象工厂模式

一、 实验目的与要求 1.练习使用工厂模式。设计相关的模拟场景并进行实施&#xff0c;验证模式特性&#xff0c;掌握其优缺点。 2.实验结束后&#xff0c;对相关内容进行总结。 二、实验内容 1.模式应用场景说明 手机CPU生产工厂&#xff1a;在一个工厂里面&#xff0c;有A…

[JavaWeb-MySQL]多表查询概述

多表查询&#xff1a; * 查询语法&#xff1a;select列名列表from表名列表where.... * 准备sql# 创建部门表CREATE TABLE dept(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20));INSERT INTO dept (NAME) VALUES (开发部),(市场部),(财务部);# 创建员工表CREATE TABLE em…

【壹刊】Azure AD(三)Azure资源的托管标识

一&#xff0c;引言来个惯例&#xff0c;吹水&#xff01;????????????????????前一周因为考试&#xff0c;还有个人的私事&#xff0c;一下子差点颓废了。想了想&#xff0c;写博客这种的东西还是得坚持&#xff0c;再忙&#xff0c;也要检查。要养成一种…