第1/24周 SQL Server 如何执行一个查询
大家好,欢迎来到第1周的SQL Server性能调优培训。在我们进入SQL Server性能调优里枯燥难懂的细节内容之前,我想通过讲解SQL Server如何执行一个查询来建立基础。这个部分非常重要,因为接下来的培训中我们会以这些概念来加深我们对SQL Server的认识。
当我们执行一个查询时,在SQL Server中最重要的组件有哪些,下面这张图片可以给大家一个概观的认识。

可以看到,SQL Server内部分成了2个部分:关系引擎和存储引擎。在关系引擎中最大的一个组件是查询优化器。查询优化器唯一和仅有的任务是把我们传入的查询语句生成实际的执行计划。
读取数据
我们提交给SQL Server 的查询,通过协议层传给命令分析器。命令分析器会检查我们是否提供了一个语法正确的语句,我们所提到的表和列在数据库里是否存在。命令分析器会生成可以重现我们查询的查询树。查询树会被查询优化器用来生成执行计划。
然后编译后的执行计划会提交给查询执行器。查询执行器的任务是执行执行计划。但是为了以后的重用,首先它会把编译好的执行计划放在执行计划缓存区进行缓存。在SQL Server 中计划缓存是个强大同时又是一个非常危险的概念。我们会在第10周讨论计划缓存的时学到更多的细节。
执行计划被缓存后,查询执行器与存储引擎进行互动,并在执行计划里执行每个操作。当我们在执行计划里访问数据时,存取方法会向缓冲区管理器读取我们想要指定页。下周我们将讨论SQL Server中页的更多细节。现在你只要知道页是8Kb的缓存,在那里存放着我们的表和索引数据。缓冲管理器管理着缓冲池(缓冲池包含执行计划缓存区和数据缓存区),那里存放着我们8kb大小的页。缓冲池是SQL Server的主要内存消耗,它的大小我们可以通过服务器属性->内存->最小、最大服务器内存(MB)来配置。
当请求的页面已经被存在缓冲池时,页会被立即读取。在SQL Server里这个被称为逻辑读。如果请求的页没存在缓冲池,缓冲区管理器会发起异步I/O操作把请求的页从我们的存储子系统中读到缓冲池,这个被称为物理读。在异步I/O操作期间,我们的查询需要一直等到操作结束才继续。在第22周我们会讨论等待和等待统计的更多细节。
一旦页被读取到缓冲池,页会被请求的访问方法取走。当执行计划执行完成后,产生的数据会通过协议层返回给提交查询的程序。
修改数据
当我们与使用修改数据的TSQL语句(INSERT,UPDATE,DELETE,MERGE)打交道时,存储引擎同样与事务管理器进行交互。事务管理器把执行事务中描述我们所做的改变通过事务日志写到事务文件。当这些日志记录写好后,事务就可以提交了。事务执行有多快,你的数据修改就有多快。
在内存中被修改的页通过称为检查点过程写回存储子系统。默认情况下,检查点每一分钟从缓冲区管理器请求所有的脏页并执行一次。脏页就是在内存里被修改,但还没有写回存储的。一旦脏页被写回存储,这个页就会被标记为干净页。
小结
从上面的描述我们可以看到,当你执行一个SQL语句查询时,SQL Server里面发生了很多不同的事情。如果你想了解更多SQL Server里各个组件间的相互操作,我强烈推荐看下SQL Server团队成员Remus Rusanu这个帖子http://rusanu.com/2013/08/01/understanding-how-sql-server-executes-a-query/。(注中文版:SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第1部分),(第2部分),(第3部分)。
上面提到的各个组件如果出现问题,都会触发SQL Server的性能问题,这些问题最后都要靠你来解决。下周我们见到的时候,将一起讨论下SQL Server中的页。
围观PPT:
0420_01_SQL_SERVER如何执行一个查询.rar
第1/24周 SQL Server 如何执行一个查询的更多相关文章
- 第1周 SQL Server 如何执行一个查询
原文:第1周 SQL Server 如何执行一个查询 大家好,欢迎来到第1周的SQL Server性能调优培训.在我们进入SQL Server性能调优里枯燥难懂的细节内容之前,我想通过讲解SQL Se ...
- 第0/24周 SQL Server 性能调优培训引言
大家好,这是我在博客园写的第一篇博文,之所以要开这个博客,是我对MS SQL技术学习的一个兴趣记录. 作为计算机专业毕业的人,自己对技术的掌握总是觉得很肤浅,博而不专,到现在我才发现自己的兴趣所在,于 ...
- 第16/24周 SQL Server 2014中的基数计算
大家好,欢迎回到性能调优培训.上个星期我们讨论在SQL Server里基数计算过程里的一些问题.今天我们继续详细谈下,SQL Server 2014里引入的新基数计算. 新基数计算 SQL Serve ...
- sql是如何执行一个查询的!
引用自:http://rusanu.com/2013/08/01/understanding-how-sql-server-executes-a-query/ Understanding how SQ ...
- sql server 根据执行计划查询耗时操作
with QS as( select cp.objtype as object_type, /*类型*/ db_name(st.dbid) as [database], /*数据库*/ object_ ...
- SQL Server存储过程执行一个带返回值(output)的存储过程
语法如下: --存储过程一CREATE PROCEDURE testProc @out VARCHAR(500) OUTPUT AS BEGIN SET @out='操作成功' RETURNEND - ...
- SQL Server 优化-执行计划
对于SQL Server的优化来说,优化查询可能是很常见的事情.由于数据库的优化,本身也是一个涉及面比较的广的话题, 因此本文只谈优化查询时如何看懂SQL Server查询计划.毕竟我对SQL Ser ...
- 对于超大型SQL SERVER数据库执行DBCC操作
原文:对于超大型SQL SERVER数据库执行DBCC操作 对于数据库维护,主要使用DBCC CHECKDB来实现,以下是对大型数据库的使用说明,小型数据库一般直接使用就可以了: 1.2008(200 ...
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...
随机推荐
- SQL入门经典(三) 之连接查询
上一篇介绍到查询.这一篇主要讲连接查询,将介绍INNER JOIN,OUTER JOIN(LEFT和RIGHT),FULL JOIN,CROSS JOIN. 连接顾名斯义就是把多个数据表数据合并到一个 ...
- 让.NET xml序列化支持Nullable
.NET的序列化,关于契约类的生成我们都是通过xsd.exe,对于值类型的可空判断是通过声明同名+Specified的bool属性来判断,比如: public class Person { publi ...
- dex分包变形记
腾讯Bugly特约作者:李金涛 一.背景 就在项目灰度测试前不久,爆出了在 Android 3.0以下手机上安装时出现 INSTALL _ FAILED_DEXOPT,导致安装失败.这一问题意味着项目 ...
- 为jQuery的$.ajax设置超时时间
jQuery的ajax模块封装了非常强大的功能,有时候我们在发送一个ajax请求的时候希望能有一个超时的时间,想让程序在一段时间请求不到数据时做出一些反馈.幸运的是jQuery为我们提供了这样的参数: ...
- 浅谈Excel开发:二 Excel 菜单系统
在开始Excel开发之前,需要把架子搭起来.最直接的那就是Excel里面的菜单了,他向用户直观的展现了我们的插件具有哪些功能.菜单出来之后我们就可以实现里面的事件和功能了.Excel菜单有两种形式,一 ...
- js中各种跨域问题实战小结(一)
什么是跨域?为什么要实现跨域呢? 这是因为JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.也就是说只能访问同一个域中的资源.我觉得这就有必要了解下javascript中的同源策略 ...
- Linux下安装Apache并以mod_wsgi方式部署django站点
源码编译方式安装Apache 首先下载Apache源码压缩包,地址为http://mirror.bit.edu.cn/apache/httpd/ 继续下载apr和apr-util压缩包,地址为http ...
- 人机大战之AlphaGo的硬件配置和算法研究
AlphaGo的硬件配置 最近AlphaGo与李世石的比赛如火如荼,关于第四盘李世石神之一手不在我们的讨论范围之内.我们重点讨论下AlphaGo的硬件配置: AlphaGo有多个版本,其中最强的是分布 ...
- KindEditor编辑器For DotNet控件
KindEditor很不错,刚接触不久,非常喜欢.KindEditor网站有ForPHP等扩展的,没有ForNet的. 我是搞.net开发的,就用它简单封装了一个控件,拖过来即可使用,使用更加简单.源 ...
- HTML+CSS学习笔记
1,html里的实际有6个<hn>标记,从<h1>到<h6>,字体由大到小. 2,em标签表示斜体. 3,<p>标签是换一个段落,<br>标 ...