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

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

关系和存储引擎

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

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

缓冲池

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

一个简单的SELECT查询

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

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语句且在等待接收结果集。

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

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

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

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

协议层(Protocal Layer)

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

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

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

命令分析器(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)去执行。(下一篇将介绍如果没有找到匹配会发生什么。)

时间: 2024-08-09 08:11:27

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

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

原文:SQL Server 2012:SQL Server体系结构--一个查询的生命周期(第3部分)(完结) 一个简单的更新查询 现在应该知道只读取数据的查询生命周期,下一步来认定当你需要更新数据时会发生什么.这个部分通过看一个简单的UPDATE查询,修改刚才例子里读取的数据,来回答. 庆幸的是,直到存取方法(Access Methods)前,更新操作和刚才SELECT语句流程是一模一样的. 这次存取方法(Access Methods)需要修改数据,因此在I/O请求传递前,修改的细节要存放于硬盘

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

计划缓存(Plan Cache) 如果SQL Server已经找到一个好的方式去执行一段代码时,应该把它作为随后的请求重用,因为生成执行计划是耗费时间且资源密集的,这样做是有有意义的. 如果没找到被缓存的计划,然后命令分析器(Command Parser)在T-SQL基础上生成一个查询树(query tree).查询树(query tree)的内部结构是通过树上的每个结点代表查询中需要的执行操作.这个树然后被传给查询优化器(Query Optimizer)去处理.我们的简单查询没有一个存在的计划

SQLSERVER 免费对比数据库结构和数据的工具支持:SQL Server 2012, SQL Server 2008 and SQL Server 2005

New xSQL Schema Compare - version 5 Compare the schemas of two SQL Server databases, review differences, generate synchronization script and execute it - xSQL Schema Compare makes database change management easy. xSQL Schema Compare supports SQL Serv

(四)一个bug的生命周期

Bug的属性 Bug重现环境 这个应该是我们重现BUG的一个前提,如果没有这个前提,我们可能会无法重现问题,或者根本就无从下手. ? 操作系统 这个是一般软件运行的一大前提,基本上所以批的软件都依赖于操作系统之上的,对于一个软件来说,要想在某个操作系统上运行,必须要对这个操作系统支持,这就需要有针对性的设计与开发.对于不同的操作系统,其可能存在差异(如:win xp 与win 7)或本质的区别(如 win 7 与 CentOS linux),所以,操作系统环境是重现问题的一个重要前提. ? 浏览

windows server 2012 + sql server 2008 r2安装

windows server 2012 r2  里面安装 sql server 2008 r2 问题总结 前提是 windows server 2012 r2 已经安装完成  ,(仅仅是安装完成 啥服务都没配置) 1.打开服务器管理器->仪表板 2.点击右上角管理 -->添加角色和功能 3.在出现界面 功能标签下 选择 .net framework 3.5 和4.5  全部选上  然后安装. 4.win + r 打开 运行--->输入服务(services.msc) 5.找到window

JVM学习笔记:JVM的体系结构与JVM的生命周期

1 JVM在java平台中的位置 1.1 Java平台组成 Java平台主要由Java虚拟机和Java API这两部分组成.参考Oracle官网. 1.2 java平台结构图 JDK1.2开始,迫于Java运行始终笔C++慢的压力,JVM的结构也慢慢发生了一些变化,JVM在某些场景下可以操作一定的硬件平台,一些核心的Java库甚至也可以操作底层的硬件平台,从而大大提升了Java的执行效率.JDK1.2之后的整个java平台如下图所示: 1.3 JVM与JRE.JDK的关系 参照Oracle官网的

关于django一个请求的生命周期

作为一个python新手,django可能是作为python开发第一个接触的web框架了,今天来说说django的生命周期. 第一步:浏览器输入网址.接下来你以为就到django的urls了?No,紧接着是要经过django里的settings.py里的MIDDLEWARE配置,也就是中间件. 第二步:中间件通过之后才会到urls,通过urls的配置,找到views里的函数或类. 第三步:执行函数或类,返回一个字符串. 第四步:再通过一系列的中间件. 第五步:前端或模板语言获取到字符串,然后解析

基础总结篇之中的一个:Activity生命周期

子曰:溫故而知新,能够為師矣.<論語> 学习技术也一样,对于技术文档或者经典的技术书籍来说,指望看一遍就全然掌握,那基本不大可能,所以我们须要常常回过头再细致研读几遍,以领悟到作者的思想精髓. 近来回想了一下关于Activity的生命周期,參看了相关书籍和官方文档,也有了不小的收获,对于曾经的认知有了非常大程度上的改善,在这里和大家分享一下. 熟悉javaEE的朋友们都了解servlet技术,我们想要实现一个自己的servlet,须要继承对应的基类,重写它的方法,这些方法会在合适的时间被ser

ASP.NET一个页面的生命周期

在学习ASP.NET页面生命周期前,需要先了解之前的ASP.NET的基本运行机制,在理解ASP.NET基本运行机制原理后,下面将介绍ASP.NET的生命周期中,页面从创建到处理结束的过程中ASP.NET Engine执行的10个事件. 1.对象初始化 页面自身以及页面中的控件,都是在Form中被首次初始化的,初始化事件可以通过OnInit()方法重载.通过在ASPX页面的后台代码文件的构造器中声明对象,页面将知道对象的类型,并知道需要创建多少个这样的对象.一旦在构造器中声明了控件,就可以在其任何