一个表或Index使用的数据页空间是由IAM Page Chain来管理的。SQL Server 使用一个IAM(Index Allocation Map)Page来管理数据库文件中最多4GB的空间,一个IAM Page映射文件中4GB大小中的区(Extent),区由8个物理地址连续的Page构成,是由分配单元(Allocation Unit)负责分配的,分配单元有三种类型:

  • IN_ROW_DATA:保存堆(heap)或索引(index)的一个分区(partition)
  • LOB_DATA:保存LOB(Large Object)数据类型,LOB数据类型是:xml,、varbinary(max)、varchar(max)和nvarchar(max)
  • ROW_OVERFLOW_DATA:保存变长数据(varchar, nvarchar, varbinary, 或 sql_variant )类型,且超过8060Bytes的列。

每一个heap或index都包含至少一个IN_ROW_DATA 分配单元,可能包含 LOB_DATA 或 ROW_OVERFLOW_DATA 分配单元。

一,对大数据行的支持

在SQL Server中,一个数据行不能跨越Page,但是,可以把行的某些部分移除该行所在的页面。一个Page上的单行可以包含的最大数据量和管理开销(Overhead)之和是8060字节。对于包含变长类型(varchar,nvarchar,varbinary或sql_variant)列的表,当一行中的所有固定大小列和变长列的总大小超过8,060字节的限制时,SQL Server将从宽度最大的列开始,把一个或多个可变长度列移动到ROW_OVERFLOW_DATA分配单元中的页面,这样一行数据实际上存储在两个或多个Page上。

只要插入或更新操作把行的总大小增加到超过8,060字节的限制,SQL Server就自动执行此操作,把最大的变长列移动到ROW_OVERFLOW_DATA分配单元中的页面中,只把存在于IN_ROW_DATA分配单元中原始页面上的24字节的指针保留下来,该指针指向ROW_OVERFLOW_DATA 页面。如果后续的更新操作导致该行减少到小于8,060字节,那么SQL Server自动把列移回到原始数据页中。

二,数据表使用的Page

一个表或Index使用的空间是由数据Page和相应的管理Page构成的,其中数据页是由IAM Page Chain来管理的,而IAM Pages也属于对象占用的硬盘空间,是为了管理数据页而必须付出的代价。一个IAM Page映射文件中的4 GB范围,并且与GAM或SGAM页的覆盖范围相同。 如果分配单元(allocation unit)包含来自多个文件或一个文件的大于4GB范围的区(Extent),那么分配单元存在多个IAMP Page,且这些IAM页面连接成一个IAM 链。IAM Page链是双向链,每一个Page中都存在向前和向后的指针,通过这两个指针找到前一个页面和后一个页面。

对于每一个数据库文件,如果分配单元在该文件中存在区(Extent),那么该分配单元在该文件上至少存在一个IAM页。也就是说,每个分配单元在其具有Extent的每个文件中至少拥有一个IAM页。 如果文件上分配给分配单元的扩展区范围超出了单个IAM页可以记录的范围(4GB),则在该文件上也可能有多个IAM页。

IAM Page根据每个分配单元的需要进行分配,IAM Page在文件中的位置是随机的,SQL Server提供一个非正式的内部使用的视图 sys.system_internals_allocation_units,该视图中的first_page字段指向分配单元的第一个IAM页面,可以认为是IAM 链(Chain)的根(Root)页面。由于分配单元的所有IAM页面都链接在一起,通过根页面里的指针,顺着双向链,可以遍历分配单元的所有IAM Page,进而可以查找到表或索引的所有数据页。

对于视图返回的字段 container_id,用于表示跟分配单元相关链的存储容器,表示的是hobt_id 或 partition_id,由type值来确定,匹配的规则如下:

  • If type = 1 or 3, container_id = sys.partitions.hobt_id.
  • If type is 2, then container_id = sys.partitions.partition_id.
  • 0 = Allocation unit marked for deferred drop

SQL Server 还提供了一个正式视图 sys.allocation_units,用于查看分配单元的信息,该视图和sys.partitions关联起来,可以用于查看跟该分配单元相关的分区数据:

select *
from sys.allocation_units u
cross join sys.partitions p
where u.type in (1,3) and u.container_id = p.hobt_id
or u.type=2 and u.container_id= p.partition_id

三,空间的延迟删除

当您删除或重建大型索引,或者删除或truncate大型表时,数据库引擎会推迟实际的page回收,直到事务提交为止。 延迟删除操作不会立即释放被分配的空间,因此,在drop或truncate大对象之后,sys.allocation_units 实时返回的值可能无法正确反映实际的可用磁盘空间。这也是 container_id =0  表示分配单元被标记为延迟删除的原因。

参考文档:

Pages and Extents Architecture Guide

SQL Server内部如何管理对象的数据Page?的更多相关文章

  1. 清空SQL Server数据库中所有表数据的方法(转)

    清空SQL Server数据库中所有表数据的方法 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可能陷入 ...

  2. SQL Server跨库复制表数据错误的解决办法

    SQL Server跨库复制表数据的解决办法   跨库复制表数据,有很多种方法,最常见的是写程序来批量导入数据了,但是这种方法并不是最优方法,今天就用到了一个很犀利的方法,可以完美在 Sql Serv ...

  3. 快速查看SQL Server 中各表的数据量以及占用空间大小

    快速查看SQL Server 中各表的数据量以及占用空间大小. CREATE TABLE #T (NAME nvarchar(100),ROWS char(20),reserved varchar(1 ...

  4. 清空SQL Server数据库中所有表数据的方法

    原文:清空SQL Server数据库中所有表数据的方法 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可 ...

  5. EF Core中,通过实体类向SQL Server数据库表中插入数据后,实体对象是如何得到数据库表中的默认值的

    我们使用EF Core的实体类向SQL Server数据库表中插入数据后,如果数据库表中有自增列或默认值列,那么EF Core的实体对象也会返回插入到数据库表中的默认值. 下面我们通过例子来展示,EF ...

  6. 将SQL SERVER中查询到的数据导成一个Excel文件

    -- ====================================================== T-SQL代码: EXEC master..xp_cmdshell 'bcp 库名. ...

  7. 也谈SQL Server 2008 处理隐式数据类型转换在运行计划中的增强 (续)

    在上一篇文章也谈SQL Server 2008 处理隐式数据类型转换在运行计划中的增强中,我提到了隐式数据类型转换添加对于数据分布非常不平均的表.评估的数据行数与实际值有非常大出入的问题,进一步測试之 ...

  8. 腾讯云图片鉴黄集成到C# SQL Server 怎么在分页获取数据的同时获取到总记录数 sqlserver 操作数据表语句模板 .NET MVC后台发送post请求 百度api查询多个地址的经纬度的问题 try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后? js获取某个日期

    腾讯云图片鉴黄集成到C#   官方文档:https://cloud.tencent.com/document/product/641/12422 请求官方API及签名的生成代码如下: public c ...

  9. 使用Sql Server Management Studio 2008将数据导出到Sql文件中

      最近需要将一个Sql Server 2005数据库中的数据导出,为了方便,就希望能导出成Sql文件,里面包含的数据是由Insert 语句组成的. 在Sql Server Management St ...

随机推荐

  1. Map随笔:最常用的Map——HashMap

    目录 Map随笔:最常用的Map--HashMap 前言: 1,HashMap的结构 2,HashMap的一些属性(JDK8) 3,HashMap的构造函数(JDK8) 4,HashMap的一些方法( ...

  2. C# 对 Excel 的相关操作

    C# 对Excel的操作 学习自: 教练辅导 C# 对Excel的读取操作 我们需要额外添加引用: References 搜索Excel 这样我们的基础就添加完成了. 并且在using 中添加: us ...

  3. Linux 部署 java1.8

    1.安装 查看java安装包 yum list | grep java 使用yum安装 yum install java-1.8.0-openjdk.x86_64 修改环境变量 vi /etc/pro ...

  4. IT兄弟连 HTML5教程 HTML5表单 HTML表单中的get和post方法

    指引 表单在网页应用中十分重要,基本上任何一个网站都必须使用到表单元素,所以表单的美观和易于交互对于网站设计就变得十分重要.HTML5对目前Web表单进行了全面提升,使得我们使用表单更加智能.它在保持 ...

  5. 《少年的你》票房被刷爆?让我用python分析一波它好看在哪里!

    最近少年的你刷爆票房,但是是真好看还是假好看,我们也不知道,所以让我们用python来分析一下~ 票房过12亿 两位主演粉丝加起来过亿 电影话题量过亿 豆瓣8.4分, 时光网8.4分, IMDB 7. ...

  6. CSS3动画的使用

    0921自我总结 CSS3动画的使用 一.动画的创建 @keyframes规则是创建动画 浏览器兼容 1.@keyframes myfirst 2.@-webkit-keyframes myfirst ...

  7. Java从入门到精通系统书籍,吐血整理的,只要1元

    思诚为修身之本,而明善又为思诚之本 我会在支付宝联系你 付完款后在支付宝账单详情页 点击联系收款方.我会回复您下载链接.

  8. Inherit from the Business Class Library Class 继承自Business类(EF)

    In this lesson, you will learn how to implement business classes for your application using the Busi ...

  9. 搜索某个目录下所有jar包中的mapper目录下的xml文件

    rm -rf /mapper/* find /data/app/app-*/lib ! -path "*xnpush*" ! -path "*portal*" ...

  10. Violet音乐社区界面原型手册

    目录 Violet音乐社区界面原型手册 一.引言 1.0 项目前阶段相关文档 1.1 编写目的 1.2 开发背景 二.界面原型展示 2.0 界面设计说明 2.1 首页 2.2 歌单/专辑/单曲界面 2 ...