4. SQL SERVER存储引擎之数据篇指针
(4.1)文件日志
(0)主数据文件.mdf初始文件大小至少为3MB,次要数据文件.ndf初始大小,同日志文件同样至少为512KB;xml
(1)SQL SERVER在逻辑上用文件组将文件分批管理(相似ORACLE的TABLESPACE),一个文件组能够包含多个文件,插入数据时,同一个文件组内的全部文件等比例增加。例如:文件组中有两个文件,初始大小分别为100M和200M,此时插入3M的数据,file1新增(100/300)*3M=1M,file2新增(200/300)*3M=2M。对象
(2)页(page),SQL SERVER中的数据文件由8K大小的数据页组成,每一个数据文件中的页从0开始编号,页大小不能够自定义,且每一个页只属于一个数据对象。blog
(3)区(extent),或者叫扩展,8个物理上连续的页为一个扩展,即64k;扩展的存在是为了不不停的分配8k的页面,提升页面分配的效率。SQL SERVER有两种类型的区,以下图: 索引
混合区:为了节约空间,将少许数据的表或索引存放在混合区,当表或索引的数据增加到8页时,再使用统一区来存放,一个混合区有8个页,每一个页能够属于不一样的数据对象,即每一个混合区最多为8个数据对象共享。it
统一区:由单个数据对象全部,若是对表中现有数据建立索引,且索引的大小超过8页,则索引将所有使用统一区,没有混合区的分配过程。io
(4.2)页table
(4.2.1)非数据页test
(0)文件头,每一个数据文件的第一页,页号为0,该页主要包括当前文件的属性描述,好比:文件组ID、文件ID、文件当前大小、文件最大/最小值、文件增量、一系列的LSN等;
(1)页面空闲空间(PFS),每一个数据文件的第二页,页号为1,该页记录当前数据文件每一个数据页的空间状态:该页是为空、已满1%到50%、已满51%到80%、已满81%到95%,仍是已满96%到100%。PFS页内用1个字节来描述1个数据页的分配及空间状态,每一个PFS页约有可用空间8088个字节,即数据文件内约每64M的空间会出现一个PFS页。
(2)全局分配映射(GAM),每一个数据文件的第3页,页号为2,该页记录当前数据文件每一个区的分配状态,0为已使用(做为混合区或统一区),1为未使用(自由区,未分配)。
(3)共享分配映射(SGAM),每一个数据文件的第4页,页号为3,该页记录当前数据文件哪些区被用做混合区,1为含有自由页面的混合区,0为自由区或已满的混合区。
(4)索引分配映射(IAM),该页跟踪数据文件中的页属于哪一个数据对象,IAM页头有8个页面指针,指向数据对象在混合区中的数据页(若是混合区中的数据被删除可能少于8个指针),IAM页内比特位为1表示该区属于本身所属的数据对象,比特位为0表示该区不属于本身所属的数据对象。
(4.1)每一个数据对象的每一个分配单元拥有一个IAM页,IAM同GAM、SGAM同样能够管理约4G的空间,若是分配单元包含多个文件,或者文件大小超过4G,则须要另外的IAM页来管理,IAM页间经过双向链表链接;
(4.2)能够经过sysindexes或sys.system_internals_allocation_units系统目录获得first_IAM页面的位置,IAM页在数据文件中的位置是随机的,可能IAM页所在文件并非所管理的那个文件;
(5)差别更改映射(DCM),每一个数据文件的第7页,页号为6(页号4,5为保留页),该页跟踪当前数据文件中,自上次全备份后被修改的区,以提升差别备份的效率,1为被修改过,0为未被修改;
(6)大批量更改映射(BCM),每一个数据文件的第8页,页号为7,该页跟踪当前数据文件中,自上第二天志备份后被大批量操做修改的区,1为被修改过,0为未被修改;
(4.2.2)数据页
(0)数据页包含页头、数据行、行偏移矩阵三部分,以下图:
(1)行内数据(IN_ROW_DATA),单行未超过8060B的数据行,或者单行超过8060B但仍存储在当前页的数据,称为行内数据;
(2)行溢出数据(ROW_OVERFLOW_DATA),在SQL SERVER2005及之后的版本中,若是表中定义了变成的数据类型,容许单行数据长度突破8060B,超过的部分即为行溢出数据,若是变长列被更新后缩短,可能会被移回行内数据页(一般减小1000字节以上时,SQL SERVER才会有检查是否可移回)。
(3)大对象数据(LOB_DATA),存放如text/image/xml/varchar(max)等最大长度可超过8000B的数据类型的数据;
大对象数据也是经过8k的数据页来存放数据,在行内数据页中包含一个16字节的指针指向大对象数据的根页,大对象数据经过B-树结构来组织多个数据页;
能够经过打开text in row选项将大对象数据存储在行内数据页,当大对象数据被更新超过500B时,则会从行内数据页将大对象数据移出,这是个日志操做,所以移动操做比较耗时,因此不建议开启该选项;
(4)数据行
每一个数据行,除了每一个列的数据以外,还包括状态位、定长列偏移量、总列数、NULL位图、变长列数、列偏移矩阵,这些即为行开销。
建立全定长列的表,数据行以下图:
if object_id ('test_col') is not null
drop table test_col;
GO
create table test_col
(
col1 char(1),
col2 char(2)
)
GO
insert into test_col values('A','B')
-------------------------------------------------------------------------------------- 原文转自:http://qianzhang.blog.51cto.com/317608/1217346--------------------------------------------------------------------------------------