SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第1部分)

图片 4

图 3-1 是一张被广泛使用的图,这个图展示的是一个用户从发出请求到得到
SQLServer 响应的流程,即查询生命周期。

阅读目录

为了缩小读取操作所涉及范围,本文首先着眼于简单的SELECT查询,然后引入执行更新操作有关的附加过程。最后你会读到,优化性能时SQLServer使用还原工具的相关术语和流程。

在整个 SQL Server 运行周期中,无论哪一步出现性能瓶颈,都将使 SQL Server
表现出性能问题。下面简要介绍一下其中涉及的各个组件。

  • 一、SQL
    Server组成部分
  • 二、查询的底层原理

图片 1

1.协议层

本系列【T-SQL】主要是针对T-SQL的总结。

 

在用户发起对数据库的请求后,该请求通过网络接口传到协议层中。 SNI
是客户端和服务器之间的连接,对于目前已发布的 SQL Server 版本,有以下 4
种网络协议。

T-SQL基础

 

1)共享内存。它是默认开启的网络协议,也是最快、最简单的协议,但是有一定的局限,只能在
SQL Server 所在的本机使用。这也是为什么经常能够在本机连接到 SQL
Server,但是外部机器连不上的原因之一,如果外部访问所需的协议没有开启,外部访问就不能连接
SQL
Server。而且,由于本机使用了共享内存协议,所以不需要做任何配置就可以连上。这个协议仅用于检查连接问题。

【T-SQL基础】01.单表查询-几道sql查询题

关系和存储引擎

如图所示,SQL
Server被分为2个主要引擎:关系引擎存储引擎关系引擎有时也被称为查询处理器,因为它的主要功能是查询优化和执行。它包含检查查询语法和准备查询树的命令解析器查询优化器毫无疑问是任何数据库系统中皇冠上的宝石;查询执行器对执行(查询计划)负责。

存储引擎对所有数据输入、输出管理负责。它包含用来处理行、索引、页、分配和行版本等修改的输入、输出请求的存取方法缓存区管理器,与SQL
Server主要内存用户缓冲池打交道。它还包含处理用来维持一致性(ACID)的数据锁和管理事务日志的事务管理器

2) TCP/IP。这是在互联网上最常用的协议,可让外部访问通过 IP
地址和端口号来访问 SQL Server。

【T-SQL基础】02.联接查询

缓冲池

在进入查询生命周期之前你需要知道的其它主要组件是缓冲池,在SQL
Server中是最大的内存用户。缓冲池里包含SQL
Server中的所有不同缓存,包括计划缓存和数据缓存,计划缓存会接在透过它生命周期的查询后的章节谈到。

3)命名管道。它与 TCP/IP 类似,不过仅限于局域网访问。该协议默认使用 445
端口,所以如果使用这种协议,需要确保这个端口的可用性。

【T-SQL基础】03.子查询

一个简单的SELECT查询

在这个例子中,使用的查询细节不重要——没有join的简单SELECT语句,因为你只是发起一起简单的读取请求。从客户端开始,那里你首先接触的组件是SQL
Server网络接口(SNI)。

4) VIA。这几乎是个没有用的协议,并且 SQL Server
出现的很多问题都是由于开启了这个服务导致的,可能在后续版本中将会移除,所以不建议用户使用。

【T-SQL基础】04.表表达式-上篇

SQL Server网络接口(SNI)

SQL
Server网络接口(SNI)是建立客户端和服务器端网络连接的协议层。它由数据库引擎和SQL
Server本地客户(SQL Server Native
Client:SNAC)都用到的一系列API组成。SNI代表在SQL Server
2000里建立的网络库和包含在操作系统里的微软数据访问组件(Microsoft Data
Access Components:MDAC)。

SNI不是被直接配置的;你要配置在客户端和服务器端的网络协议。SQL
Server支持下列协议:

  • 共享内存(Shared
    memory)——简单、快速,共享内存是用来连接本地(与SQL
    Server一样的计算机)运行客户端的默认协议。只能用在本地,没有配置属性,当从本地机器连接时始终是首次尝试的。
  • TCP/IP——这是最常用于SQL
    Server的访问协议。它通过指定IP地址和端口号使你可以连接到SQL
    Server。通常,当你指定一个连接实例时它会自动发生。你的内部命名解析系统解析实例名的主机名为IP地址,不管你为默认实例连接到默认TCP
    1433端口还是用SQL浏览服务为命名实例使用UDP
    1434找到正确的端口。
  • 命名管道(Named
    Pipes)——TCP/IP和命名管道(Named
    Pipes)是在架构里被使用的兼容协议。命名管道(Named
    Pipes)被开发来用于局域网(LANs),但也可以被不高效的用于低速网络,例如广域网(WANs)。

使用命名管道(Named
Pipes)首先需要在为SQL Server配置管理器(SQL Server Configuration
Manager)使它生效(如果你要远程连接的话),然后创建一个使用命名管道(Named
Pipes)作为协议连接到服务器的SQL Server别名。

命名管道(Named
Pipes)使用TCP
445端口,在2个电脑间的任何防火墙里请确保这个端口被打开,包括Windows防火墙。

  • VIA——虚拟接口适配器(Virtual
    Interface
    Adapter:VIA)是两个系统间高性能通讯的协议,它需要在终端和专门连接口都要有特制硬件。

与命名管道(Named
Pipes)一样,使用VIA协议首先需要在为SQL Server配置管理器(SQL Server
Configuration Manager)使它生效,然后创建一个使用虚拟接口适配器(Virtual
Interface Adapter:VIA)作为协议连接到服务器的SQL Server别名.虽然SQL
Server
2012还支持VIA协议,从以后的版本开始它会被移除,因为新安装时需要避免这个协议被安装。

不管使用哪种协议,一旦连接被建立,SQL
Server网络接口(SNI)在服务器上与表格数据流(TDS)终结点(下面会介绍)创建一个完全连接,用它来发送请求和接收数据。这里追随透过它生命周期的查询的目的是,你发送SELECT语句且在等待接收结果集。

不管使用哪种协议,一旦连接接通, SNI 会创建一个安全的 TDS
端点,用于接收和发送请求。

【T-SQL基础】04.表表达式-下篇

表格数据流终结点(Tabular Data Stream(TDS) Endpoints)

TDS是微软所有最先由Sybase设计用来与数据库服务器交互的协议。使用例如TCP/IP的网络协议一旦连接被接通,与相关TDS终结点的联系会被创建,它在客户端与服务器端之间担当着通信点。

每个网络协议都有一个TDS终结点,并且还有一个会被专用网络连接(dedicated
administrator
connection:DAC)使用。一旦连通性被创建,TDS消息会被用做客户端与服务器端间的沟通。

SELECT语句是穿过TCP/IP协议(TCP/IP是默认协议)作为TDS消息发送给SQL
Server。

2.表格数据流端点

【T-SQL基础】05.集合运算

协议层(Protocal Layer)

当SQL
Server中的协议层(Protocal Layer)收到你的TDS包,它会倒转SQL
Server网络接口(SNI)的工作,把包拆开找出里面包含的请求是什么。协议层(Protocal
Layer)同样对把结果和状态消息打包并作为TDS消息发回给客户端负责。

我们的SELECT语句在TDS包里标记为”SQL命令“类型的消息,因为它传给下一个组件,命令分析器(Command
Parser),开始走向执行的道路。

图片 2

上图显示了我们的查询现在到哪里了。在客户端,语句被SQL
Server网络接口(SNI)打包在TDS包里并发送给SQL Server中的协议层(Protocal
Layer),在那里被拆包,识别为SQL命令,这个代码被SQL
Server网络接口(SNI)发送给命令解析器(Command Parser)。

表格数据流端点起源于
Sybase,现在是微软专属的网络协议。一个网络协议一旦连接成功,就会创建一个对应的
TDS 端点,用于在客户端与服务器之间互传信息。

【T-SQL基础】06.透视、逆透视、分组集

命令分析器(Command Parser)

命令分析器(Comamnd
Parser)的角色是处理T-SQL语言事件(language
events)。它首先检查语法并通过协议层(protocol
layer)返回给客户端任何语法错误。如果语法是有效的,然后下一步就是生成查询计划(query
plan)或查找已存在的计划。查询计划(query plan)包含SQL
Server将如何去执行这段代码的细节。它通常被称为执行计划(execution
plan)。

为了检查查询计划(query
plan),命令分析器(Comamnd
Parser)会生成T-SQL的散列(hash)并核对计划缓存(plan
cache)来决定是否有合适的计划已经存在。计划缓存(plan
cache)是在缓冲池(buffer pool)里用来缓存查询计划(query
plan)的区域。如果找到匹配的,从缓存里这个计划会被读取并传给查询执行器(Query
Executor)去执行。(下一篇将介绍如果没有找到匹配会发生什么。)

对于这一步,性能问题可能会出现在把请求的内容转换成 SQL Server
能处理的格式的过程中,如果数据量大,转换开销就高,不管是从外部传入 SQL
Server 还是从 SQL Server输出到外部,都是如此。

【T-SQL基础】07.数据修改

参考文章:

 

3.命令解析器

【T-SQL基础】08.事务和并发

在 TDS 把请求转换成 SQL Server
内部可识别的格式后,首先会传到命令解析器处,这个组件会检查传入的 T-SQL
语法是否符合规定,如果语法不符合要求,就会报错并通过 TDS
把错误信息传回客户端,最后结束过程。如果语法符合要求,就会生成查询树传入查询优化器中。

【T-SQL基础】09.可编程对象

命令解析器同时也会检查是否已经存在缓存了的执行计划,如果存在,就重用;如果不存在,就让查询优化器生成执行计划。

T-SQL进阶

4.查询优化器

【T-SQL进阶】01.好用的SQL
TVP~~独家赠送[增-删-改-查]的例子

该组件是 SQL Server 的核心部分,这部分将在第 5
章中详细讲述。优化器的作用是对特定的请求进行一系列的优化,使其尽可能高效地对数据进行操作。最终选择最低开销的候选计划生成预估执行计划,并传入查询执行器执行查询。

【T-SQL进阶】02.理解SQL查询的底层原理

5.查询执行器

T-SQL性能调优

正如其名,查询执行器是执行查询的组件,但是实际上并不真正执行,而是通过
OLEDB
协议访问并使用一系列的指令操作存储引擎进行查询的执行操作。存储引擎才是实际的查询执行者。

【T-SQL性能调优】01.TempDB的使用和性能问题

6.数据访问方法

 

数据访问方法是提供数据和索引的存储、查询及修改的代码集合。它包含了所有操作数据的代码,但是并不由它自己去实际操作数据,而是提交请求到缓冲管理器。

持续更新……欢迎关注我!

7.缓冲管理器

回到顶部

缓冲管理器是管理 Buffer Pool 的组件。 Buffer Pool 是 SQL Server
内存的主要部分,它管理内存中的数据,并把适当的数据作为输出传输给。如果所需数据不在于内存中,缓冲管理器需要从磁盘读取对应的数据页到内存的数据缓存,然后把所需的数据返回给数据访问方法。这个过程中可能会出现一种等待状态
PageIOLatch,关于等待状态将在第 7 章介绍。

一、SQL Server组成部分

图片 3

8.数据缓存

1.关系引擎:主要作用是优化和执行查询。

包含三大组件:

(1)命令解析器:检查语法和转换查询树。

(2)查询执行器:优化查询。

(3)查询优化器:负责执行查询。

数据缓存是 Buffer Pool 中的最大部分,也可以说是 SQL Server
中占用内存最多的部分。它用于存放从磁盘加载到内存中的数据,以便后续操作使用。

2.存储引擎:管理所有数据及涉及的IO

包含三大组件:

(1)事务管理器:通过锁来管理数据及维持事务的ACID属性。

(2)数据访问方法:处理对行、索引、页、行版本、空间分配等的I/O请求。

(3)缓冲区管理器:管理SQL Server的主要内存消耗组件Buffer Pool。

对于当前数据缓存中每个数据库的缓存大小情况,可以使用一个 DMV
来查询——sys.dm_os_buffer_descriptors,代码清单 3-1 如下。

3.Buffer Pool

包含SQL Server的所有缓存。如计划缓存和数据缓存。

4.事务日志

记录事务的所有更改。保证事务ACID属性的重要组件。

5.数据文件

数据库的物理存储文件。

6.SQL Server网络接口

建立在客户端和服务器之间的网络连接的协议层

回到顶部

二、查询的底层原理

图片 4

1.当客户端执行一条T-SQL语句给SQL
Server服务器时,会首先到达服务器的网络接口,网络接口和客户端之间有协议层。

2.客户端和网络接口之间建立连接。使用称为“表格格式数据流”(TDS) 数据包的
Microsoft 通信格式来格式化通信数据。

3.客户端发送TDS包给协议层。协议层接收到TDS包后,解压并分析包里面包含了什么请求。

4.命令解析器解析T-SQL语句。命令解析器会做下面几件事情:

(1)检查语法。发现有语法错误就返回给客户端。下面的步骤不执行。

(2)检查缓冲池(Buffer
Pool)中是否存在一个对应该T-SQL语句的执行计划缓存。

(3)如果找到已缓存的执行计划,就从执行计划缓存中直接读取,并传输给查询执行器执行。

(4)如果未找到执行计划缓存,则在查询执行器中进行优化并产生执行计划,存放到Buffer
Pool中。

5.查询优化器优化SQL语句

当Buffer
Pool中没有该SQL语句的执行计划时,就需要将SQL传到查询优化器,通过一定的算法,分析SQL语句,产生一个或多个候选执行计划。选出开销最小的计划作为最终执行计划。然后将执行计划传给查询执行器。

6.查询执行器执行查询

查询执行器把执行计划通过OLE DB接口传给存储引擎的数据访问方法。

7.数据访问方法生成执行代码

数据访问方法将执行计划生成SQL
Server可操作数据的代码,不会实际执行这些代码,传送给缓冲区管理器来执行。

8.缓冲区管理器读取数据。

先在缓冲池的数据缓存中检查是否存在这些数据,如果存在,就把结果返回给存储引擎的数据访问方法;如果不存在,则从磁盘(数据文件)中读出数据并放入数据缓存中,然后将读出的数据返回给存储引擎的数据访问方法。

9.对于读取数据,将会申请共享锁,事务管理器分配共享锁给读操作。

10.存储引擎的数据访问方法将查询到的结果返回关系引擎的查询执行器。

11.查询执行器将结果返回给协议层。

12.协议层将数据封装成TDS包,然后协议层将TDS包传给客户端。

 

参考资料:

《SQL Server 性能优化与管理的艺术》

 

->>【T-SQL】系列文章全文目录(2017-06-02更新)

作  者:
Jackson0714

出  处:
关于作者:专注于微软平台的项目开发。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐;)】一下。您的鼓励是作者坚持原创和持续写作的最大动力!

 

出处链接:

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图