目的:通过了解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

【转】SQL存储结构(页)相关推荐

  1. MySQL笔记:第07章_InnoDB数据存储结构

    第07章_InnoDB数据存储结构 1.数据库的存储结构:页 1.1磁盘与内存交互基本单位:页 1.2页结构概述 1.3页的大小 1.4页的上层结构 2.页的内部结构 第1部分:File Header ...

  2. (八)InnoDB数据存储结构

    InnoDB数据存储结构 1.数据库的存储结构:页 1.1.磁盘与内存交互基本单位:页 1.2.页的结构概述 1.3.页的大小 1.4.页的上层结构 2.页的内部结构 第1部分:File Header ...

  3. SQL Server 表和索引存储结构

    SQL Server 表和索引存储结构 杜飞 在上一篇文章中,我们介绍了SQL Server数据文件的页面类型,系统通过96个字节的头部信息和系统表从逻辑层面上将表的存储结构管理起来,具体到表的存储结 ...

  4. SQL SERVER大话存储结构(2)

    阅读目录(Content) 1 行记录如何存储 1.1 堆表 1.2 聚集索引表格 2 非聚集索引结构 3 非聚集索引键值内容 3.1 堆表上的非聚集索引 3.2 聚集索引表(唯一)的非聚集索引 3. ...

  5. SQL Server 2008连载之存储结构——基本系统视图

    原帖首发于it168专稿,链接为http://tech.it168.com/a2010/0902/1098/000001098556_1.shtmlITPUB个人空间i{(Rht ^1X 之所以写SQ ...

  6. [转帖]真TM长的:SQL Server 2008存储结构——GAM和SGAM、PFS结构、IAM结构、DCMBCM

    谈到GAM和SGAM,我们不得不从数据库的页和区说起. https://blog.csdn.net/snowfoxmonitor/article/details/49991015 一个数据库由用户定义 ...

  7. SQL Server 2008存储结构之GAM、SGAM

    原文首发于it168专稿,链接见http://tech.it168.com/a2010/0916/1104/000001104500.shtml 谈到GAM和SGAM,我们不得不从数据库的页和区说起. ...

  8. 《MYSQL是怎样运行的》笔记|配置文件|系统变量|字符集|InnoDB存储结构|数据页结构|索引结构与使用|数据目录|表空间|连表原理|查询优化|BufferPool|事务|redo与undo|锁

    <MYSQL是怎样运行的>笔记 前记: 历时15天,笔记+看书.完成于2022.2.5. 本书是讲具体的数据库实现,而数据库系统概念见:https://blog.csdn.net/qq_4 ...

  9. sql server 索引阐述系列二 索引存储结构

    "流光容易把人抛,红了樱桃,绿了芭蕉" 转眼又年中了,感叹生命的有限,知识的无限.在后续讨论索引之前,先来了解下索引和表数据的内部结构,这一节将介绍页的存储,页分配单元类型,区的存 ...

最新文章

  1. mysql的dml语句_Mysql基础入门-SQL_DML语句
  2. 【转】Java学习---Java Web基础面试题整理
  3. 03SkypeForBusiness2015--Lync2010-2013共存部署Lync2013前端
  4. mysql命令导入导出数据_mysql命令行导入和导出数据
  5. 20个Pandas数据实战案例,干货多多
  6. CNN结构:场景分割与Relation Network
  7. 使用vue组件搭建网页应用
  8. springboot 别名不起作用_springboot之mybatis别名的设置
  9. 静态定义的receiver接收broadcast intent
  10. 春节后赚钱风口在哪?
  11. AMD如何争夺Intel市场份额?血拼高配PC装机量
  12. 给java虚拟机增加一个属性,java -D
  13. 电脑只有一个c盘怎么办_新买的电脑,拿到手只有一个C盘,如何分成两个盘
  14. Python学习笔记25:接口类、抽象类和封装
  15. pp助手苹果版_PP助手将下架?越狱时代已经过去,到底是该喜该悲
  16. Linux随笔14-私有CA搭建并签发证书、ssh客户端和服务器端常用参数
  17. 计算机主板 上电顺序,BIOS很熟悉,电脑开机BIOS开机自检顺序你知道吗?
  18. 神秘的java Https
  19. 如何入门嵌入式?ARM嵌入式开发板学习方法步骤
  20. 【MATLAB】铰链四杆机构运动分析(GUI设计)

热门文章

  1. 使用vim保存权限不够的文件
  2. 老外谈设计: 2015年WEB设计趋势
  3. 选择创业项目的基础——适合自己的才是最好的
  4. python file_python3之File文件方法
  5. 网络安全 — 安全架构
  6. 工业互联网 — TSN — Overview
  7. 互联网协议 — DNS 缓存机制
  8. 互联网协议 — GRE 通用路由封装协议
  9. gcc在Ubuntu上安装和使用
  10. stm32通用定时器的PWM输出