📜  MS SQL Server-体系结构

📅  最后修改于: 2020-11-20 05:00:39             🧑  作者: Mango


为了易于理解,我们将SQL Server的体系结构分为以下几部分:

  • 通用架构
  • 记忆体架构
  • 数据文件架构
  • 日志文件架构

一般建筑

客户端-请求发起的位置。

查询-SQL查询,是高级语言。

逻辑单元-关键字,表达式和运算符等。

N / W数据包-网络相关代码。

协议-在SQL Server中,我们有4种协议。

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

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

  • TCP / IP(用于WAN连接中的连接)。

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

服务器-安装SQL Services和数据库所在的位置。

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

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

查询优化器-通过将查询,统计信息和Algebrizer树作为输入,准备执行计划作为输出。

执行计划-就像一个路线图,其中包含要在查询执行过程中执行的所有步骤的顺序。

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

存储引擎-它负责在存储系统(磁盘,SAN等)上存储和检索数据,数据处理,锁定和管理事务。

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

Checkpoint进程-Checkpoint是一个内部进程,它将所有脏页(已修改页)从缓冲区高速缓存写入物理磁盘。除此之外,它还将日志记录从日志缓冲区写入物理文件。从缓冲区高速缓存将脏页写入数据文件的过程也称为加固脏页。

它是一个专用过程,由SQL Server在特定时间间隔自动运行。 SQL Server分别为每个数据库运行检查点过程。在意外关闭或系统崩溃\失败的情况下,检查点有助于减少SQL Server的恢复时间。

SQL Server中的检查点

在SQL Server 2012中,有四种类型的检查点

  • 自动-这是最常见的检查点,在后台作为进程运行,以确保SQL Server数据库可以在“恢复间隔-服务器配置选项”定义的时限内恢复。

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

  • 手动-该命令的运行与任何其他T-SQL语句一样,一旦发出checkpoint命令,它将运行至完成。手动检查点仅在当前数据库上运行。您还可以指定Checkpoint_Duration,它是可选的-此持续时间指定您希望检查点完成的时间。

  • 内部-作为用户,您无法控制内部检查点。针对诸如

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

    • 如果恢复模式从“完全\批量记录”更改为“简单”。

    • 同时进行数据库备份。

    • 如果您的数据库处于简单恢复模型中,则当日志已满70%时或基于服务器选项-恢复间隔,检查点过程将自动执行。

    • Alter database命令添加或删除data \ log文件也会启动检查点。

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

    • 数据库快照创建。

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

SQL Server不断监视内存使用情况以评估资源争用(或可用性);它的工作是确保始终有一定数量的可用空间。作为此过程的一部分,当发现任何此类资源争用时,它会触发Lazy Writer通过将脏页写到磁盘上来释放内存中的某些页。它采用最近最少使用(LRU)算法来决定将哪些页面刷新到磁盘。

如果“惰性编写器”始终处于活动状态,则可能表明存在内存瓶颈。

记忆体架构

以下是存储器体系结构的一些显着特征。

  • 所有数据库软件的主要设计目标之一是最大程度地减少磁盘I / O,因为磁盘读写是最消耗资源的操作之一。

  • 可以使用虚拟地址空间来调用Windows中的内存,虚拟地址空间可以由内核模式(OS模式)和用户模式(如SQL Server之类的应用程序)共享。

  • SQL Server“用户地址空间”分为两个区域:MemToLeave和缓冲池。

  • MemToLeave(MTL)和缓冲池(BPool)的大小由SQL Server在启动过程中确定。

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

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

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

缓冲池的其他部分包括-

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

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

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

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

数据文件架构

数据文件架构具有以下组件-

文件组

可以将数据库文件分为文件组,以进行分配和管理。没有文件可以是多个文件组的成员。日志文件从不属于文件组。日志空间与数据空间分开管理。

SQL Server中有两种类型的文件组:主文件和用户定义文件。主文件组包含主数据文件以及未专门分配给另一个文件组的任何其他文件。系统表的所有页面都分配在主文件组中。用户定义的文件组是在create database或alter database语句中使用file group关键字指定的任何文件组。

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

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

档案

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

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

日志文件包含用于恢复数据库的所有日志信息。数据库必须至少有一个日志文件。一个数据库可以有多个日志文件。推荐的日志文件扩展名是.ldf

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

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

范围

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

页数

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

  • 数据-包含所有数据的数据行,文本,ntext和图像数据除外。

  • 索引-索引条目。

  • Tex \ Image-文本,图像和ntext数据。

  • GAM-有关分配范围的信息。

  • SGAM-有关系统级别分配范围的信息。

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

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

  • 批量更改映射(BCM) -自上次备份日志语句以来,由批量操作修改的范围的信息。

  • 差异更改映射(DCM) -有关自上次备份数据库语句以来已更改范围的信息。

日志文件架构

SQL Server事务日志在逻辑上就像事务日志是日志记录的字符串。每个日志记录由日志序列号(LSN)标识。每个日志记录都包含它所属的事务的ID。

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

恢复操作的步骤取决于日志记录的类型-

  • 记录了逻辑操作。
    • 要向前滚动逻辑操作,请再次执行该操作。
    • 为了回滚逻辑运算,执行反向逻辑运算。
  • 记录图像之前和之后。
    • 要向前滚动操作,将应用后置图像。
    • 要回滚操作,将应用前一个图像。

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

  • 每个交易的开始和结束。

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

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

  • 创建或删除表或索引。

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

从第一个日志记录到成功写入数据库范围内必须存在的第一个日志记录到最后写入的日志记录之间的部分称为日志的活动部分或活动日志。这是完全恢复数据库所需的日志部分。活动日志的任何部分都不能被截断。该第一日志记录的LSN被称为最小恢复LSN(最小LSN)。

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

数据库引擎在创建或扩展日志文件时会动态选择虚拟日志文件的大小。数据库引擎尝试维护少量的虚拟文件。虚拟日志文件的大小或数量不能由管理员配置或设置。虚拟日志文件唯一影响系统性能的时间是物理日志文件是否由小尺寸和growth_increment值定义。

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

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