MS SQL Server - 架构

我们已将SQL Server的体系结构分类为以下部分,以便于理解和减去;

  • 一般架构

  • 内存架构

  • 数据文件架构

  • 日志文件架构

一般架构

客户 : 请求发起的地方.

查询 :  SQL查询是高级语言.

逻辑单位 : 关键词,表达式和运算符等.

N/W数据包 : 网络相关代码.

协议 : 在SQL Server中,我们有4个协议.

  • 共享内存(用于本地连接和故障排除目的).

  • 命名管道(用于LAN连接的连接).

  • TCP/IP(用于连接在广域网连接中.

  • VIA-虚拟接口适配器(需要供应商设置的特殊硬件,并且也不推荐使用SQL 2012版本.)

服务器 : 安装了SQL服务并驻留数据库的位置.

关系引擎 : 这是真正执行的地方.它包含查询解析器,查询优化器和查询执行器.

查询解析器(命令解析器)和编译器(转换器) : 这将检查查询的语法,并将查询转换为机器语言.

查询优化器 : 它将执行计划作为输出准备,将查询,统计和Algebrizer树作为输入.

执行计划 : 它就像一个路线图,其中包含作为查询执行的一部分要执行的所有步骤的顺序.

查询执行程序 : 这是在执行计划的帮助下逐步执行查询的地方,并且还将联系存储引擎.

存储引擎 : 它负责存储和检索存储系统(磁盘,SAN等)上的数据,数据操作,锁定和管理事务.

SQL OS : 这位于主机(Windows OS)和SQL Server之间.在SQL OS上处理在数据库引擎上执行的所有活动. SQL OS提供各种操作系统服务,例如使用阻塞和锁定结构的内存管理处理缓冲池,日志缓冲区和死锁检测.

检查点进程&minus ; Checkpoint是一个内部进程,它将所有脏页(已修改的页)从Buffer Cache写入物理磁盘.除此之外,它还将日志记录从日志缓冲区写入物理文件.将脏页面从缓冲区缓存写入数据文件也称为脏页硬化.

这是一个专用进程,由SQL Server以特定的时间间隔自动运行. SQL Server单独为每个数据库运行检查点进程. Checkpoint有助于减少SQL Server在意外关机或系统崩溃时的恢复时间\失败.

SQL Server中的检查点

In SQL Server 2012有四种类型的检查点 :

  • 自动 : 这是最常见的检查点,它在后台运行,以确保可以在Recovery Interval&minus定义的时间限制内恢复SQL Server数据库;服务器配置选项.

  • 间接 : 这是SQL Server 2012中的新增功能.这也是在后台运行,但是为了满足已配置选项的特定数据库的用户指定目标恢复时间.一旦选择了给定数据库的Target_Recovery_Time,这将覆盖为服务器指定的恢复间隔,并避免在此类DB上自动检查点.

  • 手动 : 这个运行就像任何其他T-SQL语句一样,一旦发出checkpoint命令,它将运行完成.手动检查点仅针对当前数据库运行.您还可以指定Checkpoint_Duration,它是可选的 - 此持续时间指定您希望检查点完成的时间.

  • 内部 &减去;作为用户,您无法控制内部检查点.发布特定操作,例如

    • Shutdown在所有数据库上启动检查点操作,除非关闭不干净(使用nowait关闭) ).

    • 如果恢复模型从Full \Bulk-logged更改为Simple.

    • 备份数据库时.

    • 如果您的数据库处于简单恢复模式,则当日志变为70%时,检查点进程会自动执行,或基于服务器选项 - 恢复间隔.

    • 更改数据库命令以添加或删除data \log文件也会启动检查点.

    • 当批量记录数据库的恢复模型并执行最少日志记录操作时,也会发生检查点.

    • 创建数据库快照.

  • 懒惰作家流程 : 懒惰的编写器会将脏页推送到磁盘,原因完全不同,因为它需要释放缓冲池中的内存.当SQL Server受到内存压力时会发生这种情况.据我所知,这是由内部进程控制的,没有设置.

SQL服务器不断监视内存用于评估资源争用(或可用性)的用法;它的工作是确保在任何时候都有一定数量的可用空间.作为此过程的一部分,当它注意到任何此类资源争用时,它会触发Lazy Writer通过将脏页写入磁盘来释放内存中的某些页面.它采用最近最少使用(LRU)算法来决定将哪些页面刷新到磁盘.

如果Lazy Writer始终处于活动状态,则可能表示内存瓶颈.

内存架构

以下是内存架构的一些显着特性.

  • 所有数据库软件的主要设计目标之一是最小化磁盘I/O,因为磁盘读写是资源最密集的操作之一.

  • Windows中的内存可以通过虚拟地址空间调用,由内核模式(操作系统模式)和用户模式(像SQL Server这样的应用程序)共享.

  • SQL Server"用户地址空间"分为两个区域:MemToLeave和Buffer Pool.

  • MemToLeave(MTL)和缓冲池(BPool)的大小由SQL Server在启动期间确定.

  • 缓冲区管理是实现高效I/O的关键组件.缓冲区管理组件包含两种机制:用于访问和更新数据库页面的缓冲区管理器,以及用于减少数据库文件I/O的缓冲池.

  • 缓冲池进一步分为多个部分.最重要的是缓冲区缓存(也称为数据缓存)和过程缓存. 缓冲区缓存将数据页保存在内存中,以便可以从缓存中检索经常访问的数据.另一种方法是从磁盘读取数据页.从缓存读取数据页通过最小化所需I/O操作的数量来优化性能,这些操作本质上比从内存中检索数据慢.

  • 过程cache 保留存储过程和查询执行计划,以最大限度地减少必须生成查询计划的次数.您可以使用DBCC PROCCACHE语句找到有关过程高速缓存中大小和活动的信息.

缓冲池的其他部分包括 :

  • 系统级数据结构 : 保存有关数据库和锁的SQL Server实例级数据.

  • 日志缓存 : 保留用于读取和写入事务日志页面.

  • 连接上下文 : 每个与实例的连接都有一小块内存来记录连接的当前状态.此信息包括存储过程和用户定义的函数参数,光标位置等.

  • 堆栈空间 :  Windows为SQL Server启动的每个线程分配堆栈空间.

数据文件架构

数据文件体系结构具有以下组件 :

文件组

数据库文件可以在文件组中组合在一起,以便进行分配和管理.没有文件可以是多个文件组的成员.日志文件永远不会成为文件组的一部分.日志空间与数据空间分开管理.

SQL Server中有两种类型的文件组,主要和用户定义.主文件组包含主数据文件和未专门分配给其他文件组的任何其他文件.系统表的所有页面都分配在主文件组中.用户定义的文件组是使用create database或alter database statement中的文件group关键字指定的任何文件组.

每个数据库中的一个文件组作为默认文件组运行.当SQL Server将页面分配给在创建时未指定文件组的表或索引时,将从默认文件组中分配页面.要将默认文件组从一个文件组切换到另一个文件组,它应具有db_owner固定数据库角色.

默认情况下,主文件组是默认文件组.用户应具有db_owner固定数据库角色,以便单独备份文件和文件组.

文件

数据库有三种类型的文件 - 主要数据文件,辅助数据文件和日志文件.主数据文件是数据库的起点,指向数据库中的其他文件.

每个数据库都有一个主数据文件.我们可以为主数据文件提供任何扩展名,但建议的扩展名为 .mdf .辅助数据文件是该数据库中的主数据文件以外的文件.某些数据库可能有多个辅助数据文件.某些数据库可能没有单个辅助数据文件.辅助数据文件的推荐扩展名为 .ndf .

日志文件包含用于恢复数据库的所有日志信息.数据库必须至少有一个日志文件.我们可以为一个数据库提供多个日志文件.建议的日志文件扩展名是 .ldf .

数据库中所有文件的位置都记录在master数据库和数据库的主文件中.大多数情况下,数据库引擎使用master数据库中的文件位置.

文件有两个名称 : 逻辑和物理.逻辑名称用于引用所有T-SQL语句中的文件.物理名称是OS_file_name,它必须遵循OS的规则.数据和日志文件可以放在FAT或NTFS文件系统上,但不能放在压缩文件系统上.一个数据库中最多可以有32,767个文件.

范围

范围是为表和索引分配空间的基本单位.范围是8个连续页面或64KB. SQL Server有两种类型的范围 -  Uniform和Mixed.统一范围仅由单个对象组成.混合扩展区最多由八个对象共享.

Pages

它是MS SQL Server中数据存储的基本单位.页面大小为8KB.每页的开头是96字节标题,用于存储系统信息,例如页面类型,页面上的可用空间量和拥有页面的对象的对象id. SQL Server中有9种类型的数据页.

  • 数据 : 包含除text,ntext和image数据之外的所有数据的数据行.

  • 索引 : 索引条目.

  • Tex \ Image : 文本,图像和ntext数据.

  • GAM : 有关已分配范围的信息.

  • SGAM : 有关系统级分配范围的信息.

  • 页面可用空间(PFS) : 有关页面上可用空间的信息.

  • 索引分配图(IAM) : 有关表或索引使用的范围的信息.

  • 批量更改地图(BCM) : 自上次备份日志语句以来批量操作修改的扩展区的信息.

  • 差异更改映射(DCM) : 有关自上次备份数据库语句以来已更改的扩展区的信息.

日志文件体系结构

SQL Server事务日志在逻辑上操作,就像事务日志是一串日志记录一样.每个日志记录由日志序列号(LSN)标识.每个日志记录都包含它所属的事务的ID.

数据修改的日志记录记录执行的逻辑操作或记录修改数据的前后映像.前映像是执行操作之前的数据副本;操作完成后,后映像是数据的副本.

恢复操作的步骤取决于日志记录的类型和减号;

  • 记录逻辑操作.

    • 要向前滚动逻辑操作,再次执行操作.

    • 要回滚逻辑操作,执行反向逻辑操作.

  • 记录图像之前和之后.

    • 要向前滚动操作,将应用后续图像.

    • 要回滚操作,之前图像已应用.

事务日志中记录了不同类型的操作.这些操作包括 :

  • 每笔交易的开始和结束.

  • 每次修改数据(插入,更新或删除).这包括系统存储过程或数据定义语言(DDL)语句更改到任何表,包括系统表.

  • 每个范围和页面分配或de分配.

  • 创建或删除表或索引.

回滚操作也会记录.每个事务都在事务日志上保留空间,以确保存在足够的日志空间来支持由显式回滚语句或遇到错误引起的回滚.事务完成后将释放此保留空间.

第一个日志记录中的日志文件部分,必须存在才能成功回滚到最后写入的日志record被称为日志的活动部分或活动日志.这是完全恢复数据库所需的日志部分.永远不会截断活动日志的任何部分.第一个日志记录的LSN称为最小恢复LSN(最小LSN).

SQL Server数据库引擎将每个物理日志文件内部划分为多个虚拟日志文件.虚拟日志文件没有固定大小,并且物理日志文件没有固定数量的虚拟日志文件.

数据库引擎动态选择虚拟日志文件的大小创建或扩展日志文件.数据库引擎尝试维护少量虚拟文件.管理员无法配置或设置虚拟日志文件的大小或数量.虚拟日志文件影响系统性能的唯一情况是物理日志文件是由small size和growth_increment值定义的.

size值是日志文件的初始大小和growth_increment值是每次需要新空间时添加到文件的空间量.如果日志文件由于许多小增量而变大,那么它们将具有许多虚拟日志文件.这可能会减慢数据库启动速度并记录备份和还原操作.

我们建议您为日志文件分配一个接近所需最终大小的大小值,并且还具有相对较大的growth_increment值. SQL Server使用预写日志(WAL),它保证在将关联的日志记录写入磁盘之前不会将数据修改写入磁盘.这样可以维护事务的ACID属性.