原文:第1周 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如何执行一个查询

上面提到的各个组件如果出现问题,都会触发SQL Server的性能问题,这些问题最后都要靠你来解决。下周我们见到的时候,将一起讨论下SQL Server中的

第1周 SQL Server 如何执行一个查询的更多相关文章

  1. 第1/24周 SQL Server 如何执行一个查询

    大家好,欢迎来到第1周的SQL Server性能调优培训.在我们进入SQL Server性能调优里枯燥难懂的细节内容之前,我想通过讲解SQL Server如何执行一个查询来建立基础.这个部分非常重要, ...

  2. sql是如何执行一个查询的!

    引用自:http://rusanu.com/2013/08/01/understanding-how-sql-server-executes-a-query/ Understanding how SQ ...

  3. SQL Server存储过程执行一个带返回值(output)的存储过程

    语法如下: --存储过程一CREATE PROCEDURE testProc @out VARCHAR(500) OUTPUT AS BEGIN SET @out='操作成功' RETURNEND - ...

  4. sql server 根据执行计划查询耗时操作

    with QS as( select cp.objtype as object_type, /*类型*/ db_name(st.dbid) as [database], /*数据库*/ object_ ...

  5. 第0/24周 SQL Server 性能调优培训引言

    大家好,这是我在博客园写的第一篇博文,之所以要开这个博客,是我对MS SQL技术学习的一个兴趣记录. 作为计算机专业毕业的人,自己对技术的掌握总是觉得很肤浅,博而不专,到现在我才发现自己的兴趣所在,于 ...

  6. SQL Server 优化-执行计划

    对于SQL Server的优化来说,优化查询可能是很常见的事情.由于数据库的优化,本身也是一个涉及面比较的广的话题, 因此本文只谈优化查询时如何看懂SQL Server查询计划.毕竟我对SQL Ser ...

  7. 对于超大型SQL SERVER数据库执行DBCC操作

    原文:对于超大型SQL SERVER数据库执行DBCC操作 对于数据库维护,主要使用DBCC CHECKDB来实现,以下是对大型数据库的使用说明,小型数据库一般直接使用就可以了: 1.2008(200 ...

  8. 第16/24周 SQL Server 2014中的基数计算

    大家好,欢迎回到性能调优培训.上个星期我们讨论在SQL Server里基数计算过程里的一些问题.今天我们继续详细谈下,SQL Server 2014里引入的新基数计算. 新基数计算 SQL Serve ...

  9. SQL Server获取下一个编码字符串的实现方案分割和进位

        我在前一种解决方案SQL Server获取下一个编码字符实现和后一种解决方案SQL Server获取下一个编码字符实现继续重构与增强两篇博文中均提供了一种解决编码的方案,考虑良久对比以上两种方 ...

随机推荐

  1. [转]PHP 5.2~5.6 对照以及功能具体解释

    [分享]PHP 5.2~5.6 对照以及功能具体解释 作者:流水理鱼wwek 来源:http://www.iamle.com/archives/1530.html 截至眼下(2014.2), PHP ...

  2. STM8S---IO复用配置(STVP方式)

    1 说明 STM8S的IO复用用程序代码配置起来比較麻烦.通常是操作flash来操作option byte字节.配置寄存器更加麻烦,能够使用STM 标准外设驱动库来设置. 本文使用一种界面配置的方式来 ...

  3. JavaScript之面向对象1

    学习过Java程序的开发人员都知道面向对象是怎么回事. 面向对象无非就是封装.多态.继承 比如: 声明一个类: class Person{ //私有成员 private String name; pr ...

  4. 黑马程序员:Java基础总结----泛型(高级)

    黑马程序员:Java基础总结 泛型(高级)   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 泛型(高级) 泛型是提供给javac编译器使用的,可以限定集合中的输入类型 ...

  5. cocos2d-x项目101次相遇: Scenes , Director, Layers, Sprites

    cocos2d-x 101次相遇 / 文件夹  1   安装和环境搭建 -xcode  2   Scenes , Director, Layers, Sprites 3   建立图片菜单  4   在 ...

  6. Cocos2d-x-lua游戏两个场景互相切换MainScene01切换到MainScene02

    /* 场景一lua代码 */ require "MainScene02" local dic_size = CCDirector:sharedDirector():getWinSi ...

  7. Android中G-Sensor相关流程

    1.使G-sensor正常工作需要做的事: G-sensor driver文件包括: driver/i2c/chips/lis331dl.c driver/i2c/chips/sensorioctl. ...

  8. CentOS 7没有ifconfig命令处理

    新安装CentOS 7 64位后发现查看ip配置的时候没有ifconfig,百度后发现# yum install net-tools软件包即可.

  9. RVDS 3.1 下载地址及破解方法

    RealView Development Suite 3.1  RVDS 3.1下载地址:https://silver.arm.com/download/Development_Tools/RVDS/ ...

  10. JAVA Socket(多个客户同时连接,信息共享) client (java/ruby)

    第一步 充分理解Socket 1.什么是socket 所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字" ...