【转】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页结构有一定的理解,呵呵,下次再和大家一起讨论如何分析行数据。^-^
原文:
转载于:https://www.cnblogs.com/ztjake/archive/2011/07/06/2099496.html
【转】SQL存储结构(页)相关推荐
- MySQL笔记:第07章_InnoDB数据存储结构
第07章_InnoDB数据存储结构 1.数据库的存储结构:页 1.1磁盘与内存交互基本单位:页 1.2页结构概述 1.3页的大小 1.4页的上层结构 2.页的内部结构 第1部分:File Header ...
- (八)InnoDB数据存储结构
InnoDB数据存储结构 1.数据库的存储结构:页 1.1.磁盘与内存交互基本单位:页 1.2.页的结构概述 1.3.页的大小 1.4.页的上层结构 2.页的内部结构 第1部分:File Header ...
- SQL Server 表和索引存储结构
SQL Server 表和索引存储结构 杜飞 在上一篇文章中,我们介绍了SQL Server数据文件的页面类型,系统通过96个字节的头部信息和系统表从逻辑层面上将表的存储结构管理起来,具体到表的存储结 ...
- SQL SERVER大话存储结构(2)
阅读目录(Content) 1 行记录如何存储 1.1 堆表 1.2 聚集索引表格 2 非聚集索引结构 3 非聚集索引键值内容 3.1 堆表上的非聚集索引 3.2 聚集索引表(唯一)的非聚集索引 3. ...
- SQL Server 2008连载之存储结构——基本系统视图
原帖首发于it168专稿,链接为http://tech.it168.com/a2010/0902/1098/000001098556_1.shtmlITPUB个人空间i{(Rht ^1X 之所以写SQ ...
- [转帖]真TM长的:SQL Server 2008存储结构——GAM和SGAM、PFS结构、IAM结构、DCMBCM
谈到GAM和SGAM,我们不得不从数据库的页和区说起. https://blog.csdn.net/snowfoxmonitor/article/details/49991015 一个数据库由用户定义 ...
- SQL Server 2008存储结构之GAM、SGAM
原文首发于it168专稿,链接见http://tech.it168.com/a2010/0916/1104/000001104500.shtml 谈到GAM和SGAM,我们不得不从数据库的页和区说起. ...
- 《MYSQL是怎样运行的》笔记|配置文件|系统变量|字符集|InnoDB存储结构|数据页结构|索引结构与使用|数据目录|表空间|连表原理|查询优化|BufferPool|事务|redo与undo|锁
<MYSQL是怎样运行的>笔记 前记: 历时15天,笔记+看书.完成于2022.2.5. 本书是讲具体的数据库实现,而数据库系统概念见:https://blog.csdn.net/qq_4 ...
- sql server 索引阐述系列二 索引存储结构
"流光容易把人抛,红了樱桃,绿了芭蕉" 转眼又年中了,感叹生命的有限,知识的无限.在后续讨论索引之前,先来了解下索引和表数据的内部结构,这一节将介绍页的存储,页分配单元类型,区的存 ...
最新文章
- mysql的dml语句_Mysql基础入门-SQL_DML语句
- 【转】Java学习---Java Web基础面试题整理
- 03SkypeForBusiness2015--Lync2010-2013共存部署Lync2013前端
- mysql命令导入导出数据_mysql命令行导入和导出数据
- 20个Pandas数据实战案例,干货多多
- CNN结构:场景分割与Relation Network
- 使用vue组件搭建网页应用
- springboot 别名不起作用_springboot之mybatis别名的设置
- 静态定义的receiver接收broadcast intent
- 春节后赚钱风口在哪?
- AMD如何争夺Intel市场份额?血拼高配PC装机量
- 给java虚拟机增加一个属性,java -D
- 电脑只有一个c盘怎么办_新买的电脑,拿到手只有一个C盘,如何分成两个盘
- Python学习笔记25:接口类、抽象类和封装
- pp助手苹果版_PP助手将下架?越狱时代已经过去,到底是该喜该悲
- Linux随笔14-私有CA搭建并签发证书、ssh客户端和服务器端常用参数
- 计算机主板 上电顺序,BIOS很熟悉,电脑开机BIOS开机自检顺序你知道吗?
- 神秘的java Https
- 如何入门嵌入式?ARM嵌入式开发板学习方法步骤
- 【MATLAB】铰链四杆机构运动分析(GUI设计)