老汉写的--SQLSERVER数据存储内幕
发布时间:2020-12-12 15:20:03 所属栏目:MsSql教程 来源:网络整理
导读:SQLSERVER 数据库中数据如何存储是 SQLSERVER 数 据库核心的知识 , 同时网络上相关的参考资料也比较少 ! 近 段时间通过学习相关知识,将自己对 SQLSERVER 数据库在数据存储方面的理解整理下来,一方面 希望能加深自己的印象,另一方面也希望能给其他的朋友提
SQLSERVER 数据库中数据如何存储是SQLSERVER 数 据库核心的知识, 同时网络上相关的参考资料也比较少! 近 段时间通过学习相关知识,将自己对SQLSERVER 数据库在数据存储方面的理解整理下来,一方面 希望能加深自己的印象,另一方面也希望能给其他的朋友提供相关的参考! 二: 页面类型 ? ?SQLSERVER 中页面类型有8 种, 具体每种类型的详细说明,见下图: ?? ? ?? ?? ? ? 数据区:对应于上图中所有数据行的总 区域,存放真正的数据,是以 Slot 为单位。一个 Slot 就是对应于一条数据记录行,从 0 开始编号 , 以 16 进制反序保存 ,Slot0,??Slot1.... 。 ? ?? ?? ? 行偏移数组:用于记录该数据页面中每个 Slot 在数据页面所处的相对位置,便于定位和检索每个 Slot 在数据页面中的位置,数组中每个记 录占两个字节。 ? 四:存储分配单位:盘区 ( 扩展 Extend) ? ??? 虽然 SQLSERVER 中数据文件存储单位是页面 (Page), 但实际 SQLSERVE 并不是为页面为单位给数据分配空 间, SQLSERVER 默认的存储分配单位是盘区。这样做的主要原因是为了提高性能。为了避免频繁的读写 IO ,在表或其它对象分配存储空间,不 是直接分配一个 8K 的页面,而是以一个盘区 (Extend) 为存储分配单位,一个盘区为 8 个页面 (=8 * 8K = 64K) 。 但是这样做虽然 减少了频繁的 IO 读写,提高的数据库性能,但却导致 出一个新问题,那就是在存储那些只有少量数据,不足 8K 的对象,如果也是分配给一个盘区,就 会存在存储空间上的浪费,降低了空间分配效率。 为解决上述问题, SQLSERVER 提供了一种解决方案,定义了两种盘 区类型 , 统一盘区和混合盘区。 ? ?? ? 其中 : 统一盘区只能存放同一个对象,该对 象拥有这个盘区的所有页面 ? ?? ? ? ?? ?? ??? 混合盘区:由多个对象共同拥有该盘 区。 ? ?? ? 在实际为对象分配存储盘区时,为了提高空间利用率,默认的情况下,如果一个对象一开始 大小小于 8 个页面,就尽量放在混合盘区中,如果该对象大小增加到 8 个页面后, SQLSERVER 会为这个对象重新分配一个统一盘 区。 为了能够通过上述策略来实现为对象 分配存储盘区, SQLSERVER 提供了 GAM/SGAM 机制来管理和维护数据文件的盘区信 息。 其中:
? ??? 具体是通过使用 DBCC 命令: DBCC PAGE. ? ??? 简单的使用例子如下: ? ?// 查看数据页面的内容的方法 ? ? -- 打开查看数据页面的开关 ? ? dbcc traceon(3604) // 打开跟踪标记 ? ? dbcc Page(northwind,1,100,1) // 打开 northwind 数据库,第 101 个页面的信息 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |