Ⅰ.What can you Learn?
- 从整体上了解到SQL Server的架构层次。
- 学习各层次的职责及基本组成。
- 中英术语结合,能够对术语加深印象,有助于阅读其他英文文献
Ⅱ. Introduction
SQL Server从应用的角度看有点像用记事本Notepad存储数据。
- 记事本:我打开记事本->写一段数据->存储为txt文件
- SQL Server:我(客户端)打开一个叫SQL Server的应用程序(与服务端建立连接)->插入一段数据->存储为一个数据库文件
我们发现,他们都运行在操作系统之上都属于应用程序,区别在于“”存储txt文件的过程“与“使用SQL Server存储数据”的过程是不一样的,那么我们接下来就学习这个存储过程的总体层次。
Ⅲ. Architecture
下图1是《Microsoft SQL Server 2012 Internals, Delaney, Beauchemin, Cunningham, et al. 2013》中的SQL Server体系结构图。
下图2是《Professional SQL Server 2012 Internals and Troubleshooting》中的SQL Server体系结构图。
图1的层次结构看上去比图2层次更清晰,但图2更直观,所以我把这两张图都拿上来了,这里帮助大家分析一下两者的区别:
- Protocol Layer(协议层)和Storage Engine两张图都是一样的。
- 图1的Query Processor(查询处理器)层次和图2的Ralation Engine(关系引擎)是同一个东西,如果大家以后看到相关术语就应该认识是这一层次。
- 图2没有标明SQLOS层次。
接下来介绍各层次的职责:
① 协议层(protocol Layer)
该层次主要负责服务器与客户端之间的通信,共有以下三种通信方式:
通信方式
- 共享内存(Shared Memory):最简单的通信方式,但是看名字就应该能猜到一个很大的限制是客户端和服务端必须在同一台电脑上(共享同一片内存空间)。如果你想将数据库配置为该协议,那么我认为最大的可能性是你想检查一下数据库的故障原因是不是协议配置错误引起的。
- 命名管道(Named Pipes):大概原理是在pipe server和一个(或多个)pipe client之间的单向或双向的通信管道. 一个命名管道的所有实例都会共享一个相同的pipe name, 但是每个实例都有他自己的缓冲区和句柄。简单来说就是一个进程通信。
- TCP/IP:这个就不多解释了= =用这个协议的话客户端和服务器端需要配置。
(如果有熟悉操作系统原理的朋友看到这三种方式是不是觉得有那么点熟悉呢?)
数据格式
知道了通信方式,那么在这个通信过程中传输的数据格式是什么样的呢?
微软定义了一个叫做tabular data stream (TDS)表格数据流 的格式,以上三种通信方式中传输的数据包都是这个叫TDS的。
TDS协议详情点击这里就能去看哦
Tips
SQL Server安装后系统会自动为以上三种方式各建立一个tabular data stream endpoint(TDS终结点)以接收相关协议的请求 ,用户也可以自行配置以增加额外的TCP方式的终结点,为了让更多的端口能接收请求嘛。
② 查询处理器(Query Processor)| 关系引擎(Relation Engine)
该层次要做两件事:.识别查询指令是干嘛的?怎么执行这个查询最好?,下面对其进行一个简单的介绍。
- Cmd Parser(指令解析器):根据收到的TDS按语法进行解析,如果错误就返回,否则将其参数化转换为Command Tree后交给Query Optimizer查询优化器。
- Query Optimizer(查询优化器):先去Plan Cache里去找缓冲里有没有这个plan,如果有的话就照这个plan执行,没有的话,就要根据Command Tree按一定算法生成执行计划(这才是真正的执行过程),然后放进plan cache里。这里就不多涉及具体细节了,会在以后的博客中分享。
- Query Executor(查询执行器):简单说就是执行指令。它会生成OLE DB(Object Linking and Embedding )交给下一层->存储引擎。
Tips
看到这里是不是听着OLEDB有点耳熟,你是不是突然有一个惊人的发现,下层的存储引擎(Storage Engine)只要支持OLEDB,就完全可以实现存储引擎互换性。但现在更多的可能是对OLEDB进行一个改进来提升性能。
③ 存储引擎(Storage Engine)
该层次主要实现的功能就是一句话:访问和管理数据,听着好像有点easy。
- Access Methods(访问方法):收到上层给的OLEDB数据了,这一里就要去搜索Data Pages(数据页)和index Pages(索引页)来去找数据了,这里提供了三个组件。
- Row and index operations(行与索引的操作):Row Operation是真正执行插入修改找某个位置数据的,但是这个操作会受到同层次的锁Lock和事务Transactions的影响),操作完成后提交给Buffer Manager缓冲区管理器。Index Operation维护了一个索引树,如果学过数据结构大家应该很熟悉:B树。(所以说优化查询的可以通过添加索引的方式来实现)
- Page allocation operations:用于管理页面pages。
- Versioning operations:用于维护一个旧的行数据,保存在temp中,细节以后再一起讨论。
- Transactions(事务管理):用于事务回滚的,为了解决像银行那种比如我一个事务操作:A转账200给B,包含减少A的本金200,增加B的本金200,如果在减少的操作中数据库宕机了,那银行就麻烦了,这里就需要事务。 这里分了两个组件:
- Log Manager:用于记录增加修改这些过程的。
- Lock Manager:用于解决数据的并发问题。
- Buffer Manager(缓冲区管理器):这里保存了已经修改更新后的pages,准备返回给客户端的,注意,处于性能考虑,更新操作不是直接更新的物理层,而是更新的缓冲区,所以这里有dirty page,细节以后再一起讨论。
④ SQLOS(SQL操作系统)
SQLOS是一个位于SQL Server和Windows之间的瘦用户模式层。它用于诸如调度、I/O完成、内存管理和资源管理等低级操作。
这一层次与OS很类似,但是它位于用户层,在体系结构篇中就不展开说明,理解他就是类似OS一样调度查询、存储资源即可以后再详细讨论实现细节。
Ⅳ. Conclusion
在本篇中大概了解了SQL Server2012的体系结构,看完这篇文章你应该已经不再只想成为一个CRUD的小白了,如果喜欢的话请持续关注哦~如果我有理解有问题的地方或者你有更好的想法欢迎批评指正。