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)去执行。(下一篇将介绍如果没有找到匹配会发生什么。)
参考文章:
SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第1部分)的更多相关文章
- SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第2部分)
计划缓存(Plan Cache) 如果SQL Server已经找到一个好的方式去执行一段代码时,应该把它作为随后的请求重用,因为生成执行计划是耗费时间且资源密集的,这样做是有有意义的. 如果没找到被缓 ...
- SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第3部分)(完结)
一个简单的更新查询 现在应该知道只读取数据的查询生命周期,下一步来认定当你需要更新数据时会发生什么.这个部分通过看一个简单的UPDATE查询,修改刚才例子里读取的数据,来回答. 庆幸的是,直到存取方法 ...
- 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 differen ...
- [oldboy-django][2深入django]django一个请求的生命周期 + WSGI + 中间件
1 WSGI # WSGI(是一套协议,很多东西比如wsgiref, uwsgiref遵循这一套协议) - django系统本质 别人的socket(wsgiref或者uwsgiref) + djan ...
- (四)一个bug的生命周期
Bug的属性 Bug重现环境 这个应该是我们重现BUG的一个前提,如果没有这个前提,我们可能会无法重现问题,或者根本就无从下手. • 操作系统 这个是一般软件运行的一大前提,基本上所有的软件都依赖于操 ...
- SQL Server 2012 - SQL查询
执行计划显示SQL执行的开销 工具→ SQL Server Profiler : SQL Server 分析器,监视系统调用的SQL Server查询 Top查询 -- Top Percent 选择百 ...
- windows server 2012 + sql server 2008 r2安装
windows server 2012 r2 里面安装 sql server 2008 r2 问题总结 前提是 windows server 2012 r2 已经安装完成 ,(仅仅是安装完成 啥服 ...
- JVM学习笔记:JVM的体系结构与JVM的生命周期
1 JVM在java平台中的位置 1.1 Java平台组成 Java平台主要由Java虚拟机和Java API这两部分组成.参考Oracle官网. 1.2 java平台结构图 JDK1.2开始,迫于J ...
- JAVA虚拟机体系结构JAVA虚拟机的生命周期
一个运行时的Java虚拟机实例的天职是:负责运行一个java程序.当启动一个Java程序时,一个虚拟机实例也就诞生了.当该程序关闭退出,这个虚拟机实例也就随之消亡.如果同一台计算机上同时运行三个Jav ...
随机推荐
- Reservoir Sampling 蓄水池抽样算法,经典抽样
随机读取数据,如何保证真随机是不可能的,因为计算机的随机函数是伪随机的. 但是在不考虑计算机随机函数的情况下,如何保证数据的随机采样呢? 1.系统提供的shuffle函数 C++/Java都提供有sh ...
- 实现Android Studio JNI开发C/C++使用__android_log_print输出Log
相信很多人在刚开始学习Android JNI编程的时候,需要输出Log,在百度Google搜索的时候都是说需要在Android.mk中加入LOCAL_LDLIBS+= -L$(SYSROOT)/usr ...
- nginx+tomcat+java部署总结
昨天部署了一下nginx+tomcat+java出现了很多问题,以下为整理总结. 使用了两种部署方式,一种是源码部署,一种是war部署. java源码部署总结: 环境:nginx+tomcat 部署方 ...
- 安装redis监控
在修改登录中心的时候,数据存储在redis里面,需要对redis进行监控,使用的是Redis-Live 参考文章: http://www.nkrode.com/article/real-time-da ...
- TaskHosting - 开发桌面工具原来还可以这么简单
由来 对于喜欢开发的我经常会写一些小工具,这些小工具多以功能为主,不要求漂亮.个性化的UI.但起码要保证使用方便,因此最基本的功能要有: GUI(图片用户界面) 程序配置的保存与读取(让用户在GUI上 ...
- spring整合activemq发送MQ消息[queue模式]实例
queue类型消息 pom依赖 <dependency> <groupId>junit</groupId> <artifactId>junit</ ...
- Java socket 多线程编程 示例
参照网上代码: 1.工程: 2.代码: Client.java package com.my.socket.test; import java.io.BufferedReader; import ja ...
- C++ STL 学习 :for_each与仿函数(functor)
简单来将,仿函数(functor)就是一个重载了"()"运算符的struct或class,利用对象支持operator()的特性,来达到模拟函数调用效果的技术. 我们平时对一个集合 ...
- 【转帖】Moodle平台的5个新玩法
[玩坏Moodle平台]Moodle平台的5个新玩法 1.RSS订阅 Moodle平台可以导入外部博客(或其他提供RSS的服务),并显示在Moodle内置的博客系统中.无论是自己的个人网站还是他人的博 ...
- win10初体验,我的错误代码哪里去了
今天闲着,就把WIN7升级安装成WIN10,感觉这次WIN10的升级方案确实还可以人,可以保留文件和配置升级. 升级完,试了一下宽带连接,发现错误代码没了,像下面的应该就691呢~~~