数据库的页构成

SQL Server中的页是最基本的数据单位组成,他有8KB,也就是8192个字节(mssql7.0以前是一个页面2KB),而sql server的一个页面,由页头,数据行,和slot table组成(行偏移的位置的记录数组。

页头

页头是一个固定的96字节的大小,他是一个页面的元数据,记载与本页相关的许多信息,具体的参数,大家可以参看我很久以前写的一篇文章,SQL server数据页页头参数列表,这篇文章没有太细致的对参数进行讲解,我在这里仔细说一下:

PAGEID

页面的ID,在mssql中,唯一定位一行数据(包括索引)的,靠的是mssql里面的一个我把它称之为的三段式表达式:FPS ID,即 file id,page id,slot idFile ID 为文件ID,找到行所在的文件,pageID找到行所在的页面,slot ID为插槽ID,即这一行位于这个页面的第几个插槽。插槽的概念会在稍后提到。1:1:2表示这行数据位于第一个文件的第一个页面的第二个插槽。

Nextpage

这个参数在页面处于页面链的时候,指示这个页面的下一个页面地址,这个的表达格式是 fileidpageid,比如:12,请注意一下,这个页面指针并不是完全指向物理磁盘上的页面地址,因为外部碎片的存在!如果是堆表,那么这两个参数会是null

objID

sysobjects 表内的对应的ID

Lsn

Log sequence number ,日志序列号,他用来记录当这个页面行数据发生改变时的日志记录号,和此前版本的lsn,这个对于事务的管理非常重要,他将指示数据是否被回滚,或者被重做。

Slotcnt

页面插槽总数。也就是这个页面有多少行。一个萝卜一个坑,一行数据一个槽。

Level

在索引页中的级别,0为子叶节点。

Indexed

0为普通数据页面(堆表),1为聚集索引页面,大于1都为非聚集索引。

Pminlen

每行数据的固定长度,比如一行数据有3int字段,1char5的字段,2varchar字段,那么固定长度是17.这个参数在mssql定位字段数据时起到至关重要的作用。

freeCnt

页面空闲的字节数,在每次需要插入数据时就检测这个值,空间是否够用。

m_ghostRecCnt

页面含有的幻影行的数目。幻影行是sql server在删除数据时,并不及时删除数据,而是仅仅将他标记为幻影行,并不对磁盘中的数据进行清空。这样做有非常大的好处。如果数据回滚,那么只需要将标记去掉即可。数据库会在空闲的时候将页面进行整理,去掉幻影行,而没有必要即时性的整理页面。

Slot table

插槽表是用于记录行在页内的逻辑顺序和物理顺序的对应数组。比如逻辑上是第一行的数据可能在这个页面内是物理上位于第二行。而这个物理上的位置,指的是在这个页面的8KB的空间内的位置,slottable有记录行的逻辑顺序数,物理顺序数,还有相对页头的偏移量,以便数据查找定位。在这里衍生的一个问题就是,逻辑上的行顺序可能存储在磁盘上的物理顺序也不会是一个顺序!(当然还有可能页面存在lob数据,成为一个页指针)

猜想:Slottable实际上是对空间的一个利用,当然也涉及到了当数据行进行增删改查时,对页面的破坏,最后在设计上导入了slot table。假设一个场景,当一个页面全部被填充满了,freecnt0的时候,删除一个数据(页面存储100个数据,删除其中的第2个),那么如果根据正常的逻辑,应该是将2到第100行的数据全部移动,然后整理出末尾还剩一行的数据。这样现实吗?那样页面所有数据都要移动,似乎不大现实。所以mssql在设计上引入了slot table ,这样,物理上和逻辑上的顺序由slot table 映射起来,存储引擎负责向slot table 要数据位置,slot table负责映射其真正的物理位置,slottable在其中搭建起一个桥梁,降低了他们之间的耦合,使得当逻辑顺序发生变化的时候,物理位置却不需要相应的变化


原文地址:http://www.cnblogs.com/perfectdesign/archive/2008/08/17/1269926.html

你可能感兴趣的:(SQl,Server,数据页)