SQL Server的页面(pages )和盘区(extents)体系结构

news2025/1/10 23:55:27

pages 和 extents 体系结构

  • 一、背景
  • 二、页面和盘区
    • 2.1、页面
    • 2.2、大行支持
    • 2.3、行溢出注意事项
    • 2.4、盘区(extents)
  • 三、管理扩展数据块分配和可用空间
    • 3.1、管理扩展数据块分配
    • 3.2、跟踪可用空间
  • 四、管理对象使用的空间
  • 五、追踪修改后的盘区
  • 总结

一、背景

页面是 SQL Server 中数据存储的基本单元。范围是八个物理上连续页面的集合。盘区有助于有效地管理页面。了解页面和盘区的体系结构对于设计和开发高效执行的数据库非常重要。

二、页面和盘区

SQL Server 中数据存储的基本单位是页面。分配给数据库中数据文件(.mdf 或 .ndf)的磁盘空间在逻辑上分为从 0 到 n 连续编号的页。磁盘 I/O 操作在页面级别执行。也就是说,SQL Server 读取或写入整个数据页。

扩展数据块是八个物理上连续的页面的集合,用于有效地管理页面。所有页面都组织到盘区中。

2.1、页面

在普通书籍中,所有内容都写在页面上。与书籍类似,SQL Server 将所有数据行写入页面上,并且所有数据页的大小相同:8 KB。在图书中,大多数页面包含数据(书籍的主要内容),而某些页面包含有关内容的元数据(例如,目录和索引)。同样,SQL Server 也不例外:大多数页面都包含用户存储的实际数据行;这些称为数据页和文本/图像页(对于特殊情况)。索引页包含有关数据所在位置的索引引用。最后,还有一些系统页面存储有关数据组织的各种元数据。

每个页面都以一个 96 字节的标头开头,该标头用于存储有关页面的系统信息。此信息包括页码、页面类型、页面上的可用空间量以及拥有页面的对象的分配单元 ID。

下表显示了 SQL Server 数据库的数据文件中使用的页类型。

页面类型内容
数据包含除文本、ntext、图像、nvarchar(max)、varchar(max)、varbinary(max) 和 xml 数据(行中的文本设置为 ON 时)之外的所有数据的数据行。
指数索引条目。
文本/图像大型对象数据类型:text、ntext、image、nvarchar(max)、varchar(max)、varbinary(max) 和 xml 数据。当数据行超过 8 KB 时,可变长度列:varchar、nvarchar、varbinary 和 sql_variant。
全局分配映射 (GAM)共享全局分配映射 (SGAM)有关是否分配盘区的信息。
页面可用空间 (PFS)有关页面分配和页面上可用空间的信息。
索引分配图 (IAM)有关每个分配单元的表或索引使用的盘区的信息。
批量更改映射 (BCM)有关自上次每个分配单元的备份日志语句以来由批量操作修改的扩展数据块的信息。
差分更改映射 (DCM)有关自上次每个分配单元的备份数据库语句以来已更改的扩展数据块的信息。

数据行以串行方式存储在页面上,紧跟在标题之后开始。行偏移表从页面末尾开始,每个行偏移表包含页面上每一行的一个条目。每个行偏移量条目存储行的第一个字节与页面开头的距离。因此,行偏移量表的功能是帮助 SQL Server 快速定位页面上的行。行偏移表中的条目与页面上的行顺序相反。

在这里插入图片描述

2.2、大行支持

行不能跨页面;但是,行的某些部分可能会移出行的页面,因此行可能非常大。页面上单行中包含的最大数据和开销为 8,060 字节。这不包括存储在文本/图像页面类型中的数据。

对于包含 varchar、nvarchar、varbinary 或 sql_variant 列的表,此限制放宽。当表中所有固定列和可变列的总行大小超过 8,060 字节的限制时,SQL Server 会将一个或多个可变长度列动态移动到ROW_OVERFLOW_DATA分配单元中的页,从宽度最大的列开始。

每当插入或更新操作使行的总大小超过 8,060 字节限制时,就会执行此操作。将列移动到ROW_OVERFLOW_DATA分配单元中的页面时,将保留IN_ROW_DATA分配单元中原始页面上的 24 字节指针。如果后续操作减小了行大小,SQL Server 会将列动态移回原始数据页。

2.3、行溢出注意事项

一行不能驻留在多个页面上,如果可变长度数据类型字段的组合大小超过 8060 字节限制,则行可能会溢出。为了说明,可以创建一个包含两列的表:一列 varchar(7000) 和另一列 varchar (2000)。单独两列都不超过 8060 字节,但如果填充每列的整个宽度,它们可以组合在一起。SQL Server 可能会动态地将 varchar(7000) 可变长度列移动到ROW_OVERFLOW_DATA分配单元中的页。组合每行超过 8,060 字节的 varchar、nvarchar、varbinary 或 sql_variant 或 CLR 用户定义类型列时,请考虑以下事项:

  • 随着记录根据更新操作而延长,将大型记录移动到另一页会动态发生。缩短记录的更新操作可能会导致记录移回IN_ROW_DATA分配单元中的原始页面。
    查询和执行其他选择操作(如对包含行溢出数据的大型记录进行排序或联接)会减慢处理时间,因为这些记录是同步处理的,而不是异步处理的。
    因此,在设计包含多个 varchar、nvarchar、varbinary 或 sql_variant 或 CLR 用户定义类型列的表时,请考虑可能流过的行的百分比以及可能查询此溢出数据的频率。如果可能对许多行溢出数据进行频繁查询,请考虑规范化表,以便将某些列移动到另一个表。然后,可以在异步 JOIN 操作中查询此内容。

  • 对于 varchar、nvarchar、varbinary 或 sql_variant 以及 CLR 用户定义类型列,各个列的长度仍必须在 8,000 字节的限制范围内。只有它们的组合长度才能超过表的 8,060 字节行限制。

  • 其他数据类型列(包括 char 和 nchar 数据)的总和必须在 8,060 字节的行限制范围内。大型对象数据也不受 8,060 字节行限制的限制。

  • 聚集索引的索引键不能包含ROW_OVERFLOW_DATA分配单元中具有现有数据的 varchar 列。如果在 varchar 列上创建了聚集索引,并且现有数据位于IN_ROW_DATA分配单元中,则对该列执行后续插入或更新操作(会将数据推送到行外)将失败。

  • 可以将包含行溢出数据的列作为非聚集索引的键列或非键列包括在内。

  • 使用稀疏列的表的记录大小限制为 8,018 字节。当转换后的数据加上现有记录数据超过 8,018 字节时,将返回 MSSQLSERVER 错误 576。在稀疏类型和非稀疏类型之间转换列时,数据库引擎将保留当前记录数据的副本。这会暂时使记录所需的存储空间加倍。

  • 要获取可能包含行溢出数据的表或索引的信息,请使用sys.dm_db_index_physical_stats动态管理功能。

2.4、盘区(extents)

盘区是管理空间的基本单位。扩展数据块是八个物理上连续的页面,即 64 KB。这意味着 SQL Server 数据库每兆字节有 16 个扩展数据块。

SQL Server 有两种类型的扩展数据块:

  • 统一扩展数据块由单个对象拥有;范围中的所有八个页面只能由所属对象使用。
  • 混合盘区最多可由八个对象共享。范围中的八个页面中的每一个都可以由不同的对象拥有。

在这里插入图片描述

三、管理扩展数据块分配和可用空间

管理扩展数据块分配和跟踪可用空间的 SQL Server 数据结构具有相对简单的结构。这有以下好处:

  • 可用空间信息密集,因此包含此信息的页面相对较少。这通过减少检索分配信息所需的磁盘读取次数来提高速度。这也增加了分配页保留在内存中并且不需要更多读取的可能性。

  • 大多数分配信息未链接在一起。这简化了分配信息的维护。可以快速执行每个页面分配或取消分配。这减少了必须分配或取消分配页面的并发任务之间的争用。

3.1、管理扩展数据块分配

SQL Server 使用两种类型的分配映射来记录盘区的分配:

  • Global Allocation Map (GAM)。GAM 页面记录已分配的盘区。每个 GAM 涵盖 64,000 个盘区,或近 4 千兆字节 (GB) 的数据。GAM 在其覆盖的间隔中的每个扩展数据块都有 1 位。

  • Shared Global Allocation Map (SGAM)。SGAM 页面记录当前用作混合盘区的盘区,并且至少有一个未使用的页面。每个 SGAM 涵盖 64,000 个盘区,或近 4 GB 的数据。SGAM 在其覆盖的间隔内具有 1 个扩展数据块。

每个扩展数据块根据其当前使用情况在 GAM 和 SGAM 中设置了以下位模式。

范围的当前使用情况GAM 位设置SGAM位设置
免费,未被使用10
均匀范围或完全混合范围00
具有免费页面的混合范围01

这会导致简单的范围管理算法。

  • 为了分配统一的扩展数据块,数据库引擎会在 GAM 中搜索一个位,并将其设置为10。
  • 若要查找具有空闲页的混合盘区,数据库引擎会在 SGAM 中搜索一点。
  • 若要分配混合盘区,数据库引擎会在 GAM 中搜索一个位,将其设置为 ,然后将 SGAM 中的相应位设置为101 。
  • 若要解除分配扩展数据块,数据库引擎应确保将 GAM 位设置为 ,并将 SGAM 位设置为10 。

数据库引擎内部使用的算法比本文中所述的算法更复杂,因为数据库引擎在数据库中均匀分布数据。但是,即使是真正的算法也可以通过不必管理扩展数据块分配信息链来简化。

3.2、跟踪可用空间

页面可用空间 (PFS) 页面记录每个页面的分配状态、是否已分配单个页面以及每个页面上的可用空间量。PFS 每页有 1 个字节,记录页面是否已分配,如果是,则记录页面是否为空、1% 到 50% 已满、51% 到 80% 已满、81% 到 95% 已满或 96% 到 100% 已满。

将扩展数据块分配给对象后,数据库引擎将使用 PFS 页记录盘区中的哪些页已分配或可用。当数据库引擎必须分配新页时,将使用此信息。页面中的可用空间量仅针对堆和文本/图像页面进行维护。当数据库引擎必须查找具有可用空间来保存新插入的行的页时,将使用它。索引不需要跟踪页面可用空间,因为插入新行的点由索引键值设置。

数据文件中会为其跟踪的每个附加范围添加新的 PFS、GAM 或 SGAM 页面。因此,在第一个 PFS 页面之后有一个新的 PFS 页面 8,088 页,在随后的 8,088 页间隔中存在额外的 PFS 页面。为了说明,页面 ID 1 是 PFS 页面,页面 ID 8088 是 PFS 页面,页面 ID 16176 是 PFS 页面,依此类推。

在第一个 GAM 页面之后有一个新的 GAM 页面 64,000 个盘区,它会跟踪其后的 64,000 个盘区;序列以 64,000 个程度的间隔继续。同样,在第一个 SGAM 页面之后有一个新的 SGAM 页面 64,000 个盘区,在随后的 64,000 个盘区间隔中还有其他 SGAM 页面。

下图显示了数据库引擎用于分配和管理盘区的页序列。
在这里插入图片描述

四、管理对象使用的空间

索引分配映射 (IAM) 页面映射分配单元使用的数据库文件的 4 GB 部分中的扩展数据块。分配单位是以下三种类型之一:

  • IN_ROW_DATA:保存堆或索引的分区。
  • LOB_DATA:保存大型对象 (LOB) 数据类型,如 xml、varbinary(max) 和 varchar(max)。
  • ROW_OVERFLOW_DATA:保存存储在超过 8,060 字节行大小限制的 varchar、nvarchar、varbinary 或 sql_variant 列中的可变长度数据。

堆或索引的每个分区至少包含一个IN_ROW_DATA分配单元。它还可能包含LOB_DATA或ROW_OVERFLOW_DATA分配单元,具体取决于堆或索引架构。

IAM 页面涵盖文件中的 4 GB 范围,与 GAM 或 SGAM 页面的覆盖范围相同。如果分配单元包含来自多个文件的扩展数据块,或者一个文件的多个 4 GB 范围,则 IAM 链中将链接多个 IAM 页面。因此,每个分配单元对于其具有扩展数据块的每个文件至少有一个 IAM 页面。如果分配给分配单位的文件上的扩展数据块范围超过单个 IAM 页面可以记录的范围,则文件上也可能有多个 IAM 页面。
在这里插入图片描述
IAM 页面根据每个分配单元的要求进行分配,并随机位于文件中。系统视图指向分配单位的第一个 IAM 页面。该分配单元的所有 IAM 页面都链接在 IAM 链中。
在这里插入图片描述
IAM 页面具有一个标题,指示 IAM 页面映射的范围范围的起始范围。IAM 页面还具有一个大位图,其中每个位表示一个扩展数据块。地图中的第一个位表示范围中的第一个范围,第二个位表示第二个范围,依此类推。如果位为 ,则它所表示的范围不会分配给拥有 IAM 的分配单元。如果位为 ,则它所表示的范围将分配给拥有 IAM 页面的分配单元。

当数据库引擎必须插入新行并且当前页中没有可用空间时,它会使用 IAM 和 PFS 页查找要分配的页,或者对于堆或文本/图像页,查找具有足够空间来保存该行的页。数据库引擎使用 IAM 页查找分配给分配单元的盘区。对于每个盘区,数据库引擎都会搜索 PFS 页,以查看是否有可以使用的页。每个 IAM 和 PFS 页面都涵盖许多数据页面,因此数据库中的 IAM 和 PFS 页面很少。这意味着 IAM 和 PFS 页面通常位于 SQL Server 缓冲池的内存中,因此可以快速搜索它们。对于索引,新行的插入点由索引键设置,但是当需要新页面时,将发生前面描述的过程。

仅当数据库引擎无法在现有扩展数据块中快速找到具有足够空间来容纳要插入的行的页面时,它才会将新扩展数据块分配给分配单元。

数据库引擎使用比例填充分配算法从文件组中可用的盘区中分配盘区。在包含两个文件的同一文件组中,如果一个文件的可用空间是另一个文件的两倍,则将从文件中分配两页,其中从另一个文件分配的每一页都有可用空间。这意味着文件组中的每个文件都应具有相似的已用空间百分比。

五、追踪修改后的盘区

SQL Server 使用两种内部数据结构来跟踪由大容量复制操作修改的盘区,以及自上次完整备份以来修改的盘区。这些数据结构大大加快了差异备份的速度。当数据库使用大容量日志恢复模式时,它们还可以加快大容量复制操作的日志记录。与 GAM 和 SGAM 页面一样,这些结构是位图,其中每个位表示单个扩展数据块。

  • 差分更改映射 (DCM):这将跟踪自上次语句以来已更改的范围。差异备份仅读取 DCM 页以确定修改了哪些盘区。这大大减少了差异备份必须扫描的页数。差异备份运行的时间长度与自上一条语句以来修改的扩展数据块数成正比,而不是与数据库的总体大小成正比。

  • 批量更改映射 (BCM):这将跟踪自上一条语句以来被大容量日志操作修改的盘区。尽管 BCM 页显示在所有数据库中,但仅当数据库使用大容量日志恢复模式时,它们才相关。

DCM 页面和 BCM 页面之间的间隔与 GAM 和 SGAM 页面之间的间隔相同,为 64,000 个盘区。DCM 和 BCM 页面位于物理文件中的 GAM 和 SGAM 页面后面,如下所示:

在这里插入图片描述

总结

  1. 日志文件不包含页面。它们包含一系列没有固定大小的日志记录。
  2. 系统功能未记录在案,可能会发生变化。不保证兼容性。
  3. 系统视图仅供内部使用,可能会发生变化。不保证兼容性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/421286.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Cloud Alibaba全家桶(九)——分布式事务组件Seata

前言 本文小新为大家带来 分布式事务组件Seata 相关知识,具体内容包括分布式事务简介(包括:事务简介,本地事务,分布式事务典型场景,分布式事务理论基础,分布式事务解决方案)&#xf…

PyTorch 之 基于经典网络架构训练图像分类模型

文章目录一、 模块简单介绍1. 数据预处理部分2. 网络模块设置3. 网络模型保存与测试二、数据读取与预处理操作1. 制作数据源2. 读取标签对应的实际名字3. 展示数据三、模型构建与实现1. 加载 models 中提供的模型,并且直接用训练的好权重当做初始化参数2. 参考 pyto…

可视化CNN和特征图

卷积神经网络(cnn)是一种神经网络,通常用于图像分类、目标检测和其他计算机视觉任务。CNN的关键组件之一是特征图,它是通过对图像应用卷积滤波器生成的输入图像的表示。 理解卷积层 1、卷积操作 卷积的概念是CNN操作的核心。卷积是一种数学运算&#x…

当深度学习遇上Web开发:Spring和OpenAI如何实现图片生成?

文章目录一、简介1. 什么是Spring和OpenAI2. 生成图像的意义和应用场景二、相关技术介绍1. 深度学习模型2. GAN模型3. TensorFlow框架四、简单的Spring应用1. 搭建Spring项目2. 添加相关依赖3. 编写简单的控制器五、OpenAI API1. 介绍OpenAI API2. 搭建OpenAI API环境3. 配置AP…

Pytorch实现GCN(基于Message Passing消息传递机制实现)

文章目录前言一、导入相关库二、加载Cora数据集三、定义GCN网络3.1 定义GCN层3.1.1 消息传递阶段(message)3.1.2 消息聚合阶段(aggregate)3.1.3 节点更新阶段(update)3.1.4 定义传播过程(propag…

AI时代来临,如何把握住文档处理及数据分析的机遇

AI时代来临,如何把握住文档处理及数据分析的机遇前言一、生成式人工智能与元宇宙二、面向图像文档的复杂结构建模研究三、大型语言模型的关键技术和实现ChatGPT 介绍ChatGPT的三个关键技术四、ChatGPT与文档处理未来总结前言 在3月18日,由中国图象图形协…

【CVPR 2023】FasterNet论文详解

论文名称:Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks 论文地址:https://arxiv.org/abs/2303.03667 作者发现由于效率低下的每秒浮点运算,每秒浮点运算的减少并不一定会导致类似水平的延迟减少。提出通过同时减少冗…

YOLOv2论文解读/总结

本章论文: YOLOv2论文(YOLO9000: Better, Faster, Stronger)(原文+解读/总结+翻译) 系列论文: YOLOv1论文解读/总结_yolo论文原文_耿鬼喝椰汁的博客-CSDN博客 前言 在YOLOv1推出一…

k8s 部署nginx 实现集群统一配置,自动更新nginx.conf配置文件 总结

k8s 部署nginx 实现集群统一配置,自动更新nginx.conf配置文件 总结 大纲 1 nginx镜像选择2 创建configmap保存nginx配置文件3 使用inotify监控配置文件变化4 Dockerfile创建5 调整镜像原地址使用阿里云6 创建deploy部署文件部署nginx7 测试使用nginx配置文件同步&…

ETL 与 ELT的关键区别

ETL 和 ELT 之间的主要区别在于数据转换发生的时间和地点 — 这些变化可能看起来很小,但会产生很大的影响! ETL 和 ELT 是数据团队引入、转换并最终向利益干系人公开数据的两种主要方式。它们是与现代云数据仓库和 ETL 工具的开发并行发展的流程。 在任…

来自清华的AdaSP:基于自适应稀疏成对损失的目标重识别

文章目录摘要1、简介2、相关工作3、方法3.1、稀疏成对损失3.2、最小难度的正样本挖掘4、实验4.1、与其他成对损失的比较4.2、消融研究5、结论摘要 论文链接:https://arxiv.org/abs/2303.18247 物体重识别(ReID)旨在从大型图库中找到与给定探针具有相同身份的实例。…

【分布式版本控制系统Git】| 国内代码托管中心-Gitee、自建代码托管平台-GitLab

目录 一:国内代码托管中心-码云 1. 码云创建远程库 2. IDEA 集成码云 3. 码云复制 GitHub 项目 二:自建代码托管平台-GitLab 1. GitLab 安装 2. IDEA 集成 GitLab 一:国内代码托管中心-码云 众所周知,GitHub 服务器在国外&…

Kaggle 赛题解析 | AMP 帕金森进展预测

文章目录一、前言二、比赛说明1. Evaluation2. Timeline3. Prize4. Code Requirements三、数据说明四、总结🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、前言 竞赛题目:AMP-Parkinson’s Disease Progression Prediction 竞赛地址…

漫画:什么是快速排序算法?

这篇文章,以对话的方式,详细着讲解了快速排序以及排序排序的一些优化。 一禅:归并排序是一种基于分治思想的排序,处理的时候可以采取递归的方式来处理子问题。我弄个例子吧,好理解点。例如对于这个数组arr[] { 4&…

Python调用GPT3.5接口的最新方法

GPT3.5接口调用方法主要包括openai安装、api_requestor.py替换、接口调用、示例程序说明四个部分。 1 openai安装 Python openai库可直接通过pip install openai安装。如果已经安装openai,但是后续提示找不到ChatCompletion,那么请使用命令“pip instal…

07平衡负载:gRPC是如何进行负载均衡的?

负载均衡(Load Balance),其含义就是指将请求负载进行平衡、分摊到多个负载单元上进行运行,从而协同完成工作任务。 负载均衡的主要作用: 提升并发性能:负载均衡通过算法尽可能均匀的分配集群中各节点的工作量,以此提高集群的整体的吞吐量。 提供可伸缩性:可添加或减少服…

【react 全家桶】状态提升

本人大二学生一枚&#xff0c;热爱前端&#xff0c;欢迎来交流学习哦&#xff0c;一起来学习吧。 <专栏推荐> &#x1f525;&#xff1a;js专栏 &#x1f525;&#xff1a;vue专栏 &#x1f525;&#xff1a;react专栏 08 【状态提升】 文章目录08 【状态提升】1.介绍…

【Python实战】Python采集二手车数据——超详细讲解

前言 今天&#xff0c;我们将采集某二手车数据&#xff0c;通过这个案例&#xff0c;加深我们对xpath的理解。通过爬取数据后数据分析能够直观的看到二手车市场中某一品牌的相对数据&#xff0c;能够了解到现在的二手车市场情况&#xff0c;通过分析数据看到二手车的走势&#…

C++初阶 -1- C++入门part2-引用

文章目录6.引用什么是引用&#xff1f;引用的使用引用的应用传值、传引用效率比较权限引用和指针的区别⭐7.内联函数8.auto关键字9.基于范围的for循环10.指针空值——nullptr6.引用 什么是引用&#xff1f; “别名” int a 0; int& b 0;&#x1f446;即 地址为0x00000…

Redis7搭建主从+集群三主三从主从关系由集群分配

目录文件不清晰的去Redis7搭建主从哨兵了解 别忘记关闭防火墙 hash算法一致性 1背景–主从关系由客户端构建分配 三台虚拟机&#xff0c;一台虚拟机搭建两个redis 且两个不同的端口 第一台ip和分配两个端口 6381 6382 --- 192.168.154.128 6381 6382 第二台ip和分配两个…