数据库空间管理-学习笔记
来自《SQL Server 2012实施与管理实战指南》
1.数据文件的存储结构:
页:数据存储的基本单位是页,每一个页为8kb,每MB有128页。磁盘的IO操作在页级。每页开头是一个96字节的页头,用于存储页的系统信息,包括页码、页类型、页的可用空间,以及拥有该页的对象的分配单元ID。不同类型的数据存储在不同类型的页面里面。
(1) GAM(Global allocation map):存储在数据文件的第3个页上,文件和 页编码为(1:2),以Bit位来标识相应的区(Extends)是否已经分配。差不多能标识64000个区(8kb page*8 bit per byte),即64000*8kb*8=4096000kb=4GB.当数据空间超过4GB时,则以另一个GAM来标识下一个4GB的空间。
Bit=1,代表区空闲,可分配
Bit=0,代表区已被使用
(2) SGAM(Shared Global Allocation Map),存储在数据文件的第4个页上,文件和页编号为(1:3),结构和GAM相同,bit含义不同
Bit=1,代表混合区,且区内至少有一个页可用来分配;
Bit=0, 代表混合区或统一区,但区内所有页都已被使用;
区:8个物理上连续的页的集合,如果区内8个页属于同一个table,则叫统一区。否则,叫混合区
(3) (PFS)Page free space:存储本数据文件里所有页分配和可用空间的信息
(4) Index allocation map:表或索引使用空间的信息
(5) Bulk changed map:自最后一个backup log语句之后的大容量操作所修改的区的信息
(6) Differential changed map:自最后一条Backup database 语句之后更改的区的信息
(7) Data:用来存放数据
(8) Row overflow page:当一条记录超过8000字节时候,借此存放超出部分的数据
(9) LOB:存放大型对象数据类型:Text、ntext、image、nvarchar(max)、Varchar(max)、Varbinary(max)和XML数据
2.表存储结构
每张表对应一个object ID,并拥有一个或多个partition,通常一个partition对应一个索引,每个Partition会有一个或多个Heap或B-tree(简称Hobt),通常认为Partition与Hobt是一样的,Partition ID也是Hobt ID.每个Hobt至多有3个分配单元用于存放数据。最频繁分配的单元是Data。
(1) 表没有任何索引
表按Heap(堆)的结构存储,只有一个Partition。在系统表里,对于Partition下的每个分配单元都有一个连接指向IAM 页,并在页里描述了区的信息,所有数据页之间没有任何关系,完全依赖IAM页组织。
(2) 有非聚集索引而没有聚集索引的表
每一个非聚集索引,对应一个Partition,在每个partition下的每个分配单元,都有一个连接指向Root Page,数据页之间通过前后指针互相联系,是一个完整的树形结构, 在结构的底层有一个连接指向真正的数据,然后以heap的方式存放。
(2) 表有聚集索引
聚集索引,IndexID=1,对应一个partition,