【转】SQL存储结构(页)

目的:通过了解SQL Server的存储原理,我们才能从本质上掌握好SQL,才能设计出优良的表结构,写出高效的SQL语句,设计出最优的索引。

        这一节我们一起来了解SQL Server最小的存储单位:页(Page),一个页的大小是8K=8192字节。一个数据页是由3部分组成:页头、数据行和行偏移矩阵,具体结构如图:

       

        页头:保存了页的编号、上一页ID、下一页ID、页相关的系统信息、页类型、页的可用空间以及拥有该页的对象的分配单元ID等等关于该页的基本信息。页头的大小是固定的96个字节,所以剩下8192-96=8096个字节用于存储数据行和行偏移矩阵。下图是页头的结构:

        行偏移矩阵:在页的最后面,而且是倒序排列的,使用2个字节来表示数据行在页面内部的偏移量,有1行数据则行偏移矩阵的大小是2字节,有2行数据则行偏移矩阵的大小是4字节,以此类推。

        数据行:除了页头占用的空间和行偏移矩阵占用的空间,中间剩下的空间就是给数据行使用的,行不能跨页,行不能跨页,对于可变长类型的列,如果行超过可容纳最大字节数,则从最大长度的列开始,将一个或多个可变长度列移动到ROW_OVERFLOW_DATA分配单元中的页,在原始页上维护一个24字节的指针,如果行的总大小小于容纳最大字节数,就再移回来.执行查询等操作时将延长处理时间,因为这些记录将同步处理,而不是异步。 假设我们要在一个页中保存1行数据,那么这1行数据可以使用8*1024(页)-96(页头)-2(行偏移矩阵)- 数据行的开销(这个计算我们在了解行数据结构后得出) < 8090 个字节的空间,也就是说1行数据可以使用至少小于8090个字节的空间。这里的小于8090个字节并不是完全都用来保存数据行,一个数据行中还存在其他的 信息用于表示该行数据,具体的结构是这样的:

状态位A状态位B定长数据类型的长度定长数据的内容列数
NULL位图
变长列的个数变长列的偏移矩阵变长列的数据
1字节
1字节2字节具体定长数据字节2字节
2 + ((总列数 + 7) / 8)
2字节
变长列个数*2个字节具体变长数据字节


        状态位A:

        1.bit0 版本信息,在SQL Server 2005中这个位总是0.
        2.bit1至bit3 作为一个3位的值,0表示是一条主记录,1表示是一条转移过的记录,2表示一个转移桩,3表示一条索引记录,4表示一段blob或行溢出数据,5表示ghost索引记录,6表示ghost数据记录。
3.bit4 表示存在一个NULL位图;在SQL Server2005中,及时任何列都不允许NULL值,NULL位图也总是存在的。
        4.bit5表示行中有变长列。
        5.bit6 SQL Server2005还未启用。
        6.bit7 表示幽灵记录。

       状态位B:SQL Server 2005中还未使用。

       NULL位图:计算占用字节:2 + ((总列数 + 7) / 8)

       没有变长列的截图举例:

       

        有定长列的截图举例:

       

        不管我们对表的定义是多么的简单,一行数据除了数据自身占用的空间外,至少还要占用1+1+2+2+1=7个字节。如果定义的数据列很多,或者里面有变长 数据列,那么占用的空间可能会更多。那么我们接着来计算行数据开销:上述我们得即使一个表只有一个列,那么它的行的数据最多只有8090个字节再减去如上 的开销。通过上图大家可以先意会下,希望能对SQL Server页结构有一定的理解,呵呵,下次再和大家一起讨论如何分析行数据。^-^


原文:

http://www.cnblogs.com/mingblog/articles/1745412.html

转载于:https://www.cnblogs.com/ztjake/archive/2011/07/06/2099496.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值