你要擦亮眼睛看看自己是不是有备胎嘛?

存储引擎包括存取方法、事务管理和缓冲区管理器 。存取方法(Access Methods) SQL Server需要定位数据库时 , 会调用存取方法代码 。它提供了一组代码 , 用来创建和请求对数据页面和索引页面进行扫描 , 并且将准备好的OLE DB数据行集返回给关系引擎 。存取方法并不
存储引擎包括存取方法、事务管理和缓冲区管理器 。
存取方法(Access Methods)
SQL Server需要定位数据库时 , 会调用存取方法代码 。它提供了一组代码 , 用来创建和请求对数据页面和索引页面进行扫描 , 并且将准备好的OLE DB数据行集返回给关系引擎 。存取方法并不真正进行操作 , 它只负责向缓冲区管理器发出请求 。存取方法不仅仅如此 , 它还会预测哪些数据页面索引页面即将处理 , 这样才能保证SQLServer高速处理 。
事务管理器(Transaction Manager)
事务管理器包括两个组件:日志管理器和锁管理器 。
锁管理器负责数据的并发保护和基于特定隔离级别的管理 。
日志管理器负责将事务日志提前记录于日志文件中 , 从而起到保护数据的作用 。访问方法代码请求的所有数据更改都必须记入日志中 , 这种方式称为预写日志 。这是数据修改(插入、更新、删除、分配释放区和页、创建删除索引等)唯一总是写磁盘的的操作 。它记录的是修改操作发生以后数据页面发生的改变 , 因此我们很难从中发现有意义的信息 。除非用些第三方的工具 。
缓冲区管理器(Buffer Manager)
缓冲区管理器用来管理缓冲区内存池中数据页面的分布 。所有对数据的操作 , 都是先在缓冲区中操作的 。然后由SQLOS中的检查点或者是惰性写入器同步到磁盘中 。这样能保证SQLServer更快的响应请求 。操作完成后就结果返回给访问方法 。
【你要擦亮眼睛看看自己是不是有备胎嘛?】 四、缓冲池
缓冲池是SQLServer最消耗内存的部分 。主要包含执行计划缓存和数据缓存 。
五、SQLOS
可以理解为是SQLServer的资源管理器 , 主要负责与操作系统中的一些交互操作 。如:内存分配、资源调度、I/O操作、进程线程管理以及同步、闩锁等等 。这部分在此不展开 , 后期考虑专门写一章 。
三、SQLServer执行模型

你要擦亮眼睛看看自己是不是有备胎嘛?

文章插图
从图中可以看出 , 我这的执行模型也说的是整个SQLServer服务端在接收请求时 , 要发生的事情 。但是和前面一样 , SQLServer很多时候很多细化过于复杂没有办法能用一章图描述清楚 。这个图简单的说明了SQLServer的执行模型 。在分析这个图前 , 要明确一个问题 。SQLServer是基于C/S的结构的产品 。这样很明显就分为客户端与服务端 。平时管理数据库的MSSMS以及我们需要访问数据库的系统就是属于SQLServer的客户端 , SQLServer服务端主要是由一些服务方式构成 。
因为是C/S , 那么客户端的所有请求都必须传输到服务端 , 才能被执行 。这样的话就涉及的双方通信的协议 , 这个协议在SQLServer2005后 , 就称为SNI 。包的格式就是TDS 。客户端的TDS通过SQLServer支持的协议传输到SQLServer服务端 , 服务端有一个组件叫连接监听服务 , 它一直在监听这请求端口 。它负责监听新的连接 , 清除失败连接 , 将结果集、消息和状态返回给客户端 。连接监听服务会把包发送给协议层 , 协议层对这个包进行解包 , 提取里面要执行的SQL语句 , 交给关系引擎 , 关系引擎经过处理后生成执行计划 , 并且执行计划 。一旦关系引擎开发执行工作计划时 , 就会创建任务对象 。任务对象必须关联一个空闲工作线程 。工作线程关联到新任务后 , 状态设置为初始化 。当完成初始化后 , 工作线程就转成为可运行 。这时工作线程就准备就绪 , 只要有空闲的调度器就可以执行了 。如果执行过程中遇到定时器等待、请求资源等待、I/O等待就会挂起移至相应的列表中 。SQLServer采用了非抢占式调度 。一个线程会完成这个任务的操作 。不存在上下文切换 , 当然如果不是SQLServer的代码则采用抢占式调度 , 比如扩展存储过程 。