标签:
为了缩小读取操作所涉及范围,本文首先着眼于简单的SELECT查询,然后引入执行更新操作有关的附加过程。最后你会读到,优化性能时SQLServer使用还原工具的相关术语和流程。
如图所示,SQL Server被分为2个主要引擎:关系引擎和存储引擎。关系引擎有时也被称为查询处理器,因为它的主要功能是查询优化和执行。它包含检查查询语法和准备查询树的命令解析器;查询优化器毫无疑问是任何数据库系统中皇冠上的宝石;查询执行器对执行(查询计划)负责。
存储引擎对所有数据输入、输出管理负责。它包含用来处理行、索引、页、分配和行版本等修改的输入、输出请求的存取方法;缓存区管理器,与SQL Server主要内存用户缓冲池打交道。它还包含处理用来维持一致性(ACID)的数据锁和管理事务日志的事务管理器。
在进入查询生命周期之前你需要知道的其它主要组件是缓冲池,在SQL Server中是最大的内存用户。缓冲池里包含SQL Server中的所有不同缓存,包括计划缓存和数据缓存,计划缓存会接在透过它生命周期的查询后的章节谈到。
在这个例子中,使用的查询细节不重要——没有join的简单SELECT语句,因为你只是发起一起简单的读取请求。从客户端开始,那里你首先接触的组件是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支持下列协议:
使用命名管道(Named Pipes)首先需要在为SQL Server配置管理器(SQL Server Configuration Manager)使它生效(如果你要远程连接的话),然后创建一个使用命名管道(Named Pipes)作为协议连接到服务器的SQL Server别名。
命名管道(Named Pipes)使用TCP 445端口,在2个电脑间的任何防火墙里请确保这个端口被打开,包括Windows防火墙。
与命名管道(Named Pipes)一样,使用VIA协议首先需要在为SQL Server配置管理器(SQL Server Configuration Manager)使它生效,然后创建一个使用虚拟接口适配器(Virtual Interface Adapter:VIA)作为协议连接到服务器的SQL Server别名.虽然SQL Server 2012还支持VIA协议,从以后的版本开始它会被移除,因为新安装时需要避免这个协议被安装。
不管使用哪种协议,一旦连接被建立,SQL Server网络接口(SNI)在服务器上与表格数据流(TDS)终结点(下面会介绍)创建一个完全连接,用它来发送请求和接收数据。这里追随透过它生命周期的查询的目的是,你发送SELECT语句且在等待接收结果集。
TDS是微软所有最先由Sybase设计用来与数据库服务器交互的协议。使用例如TCP/IP的网络协议一旦连接被接通,与相关TDS终结点的联系会被创建,它在客户端与服务器端之间担当着通信点。
每个网络协议都有一个TDS终结点,并且还有一个会被专用网络连接(dedicated administrator connection:DAC)使用。一旦连通性被创建,TDS消息会被用做客户端与服务器端间的沟通。
SELECT语句是穿过TCP/IP协议(TCP/IP是默认协议)作为TDS消息发送给SQL Server。
当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)。
命令分析器(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 2012:SQL Server体系结构——一个查询的生命周期(第1部分)
标签:
原文地址:http://www.cnblogs.com/woodytu/p/4471386.html