SQL Server 堆表行存储大小(Record Size)
一.本文所涉及的内容(Contents)
- 本文所涉及的内容(Contents)
- 背景(Contexts)
- 堆表行记录存储格式(Heap)
- 案例分析(Case)
- 参考文献(References)
二.背景(Contexts)
有的时候你需要计算堆表的一行记录有多大?又或者想计算一个数据页(8K)能保存多少条记录?字段类型是设计成nchar还是nvarchar?他们有什么区别呢?在做数据库表设计的时候会经常出现这些问题。要计算一行记录的大小,并不是简单把列字段类型大小直接相加就行的,具体原因请看下文。
三.堆表行记录存储格式(Heap)
下面是计算堆表行记录大小的公式,它引自MSDN:估计堆的大小
计算公式:Row_Size = Fixed_Data_Size + Variable_Data_Size + Null_Bitmap + 4
= 所有固定长度列的总字节大小 + 可变长度数据的大小 + Null位图 + 数据行的行标题开销
单看上面的计算公式是比较难理解的,而且MSDN并没有提供相关的说明,比如上面公式后的4代表什么意思?我参考了一些书籍之后整理出下面更容易理解的堆记录存储格式图,希望能帮助大家理解:
(Figure1:堆表记录存储格式)
四.案例分析(Case)
本文针对堆表数据页的存储做一个测试,测试不同数据类型的存储大小,测试的数据类型包括:int、char、nchar和nvarchar,测试后你会理解什么是定长类型、什么是变长类型,他们在存储上有什么区别;
(一) 首先创建一个测试数据库;
/******* Step1:创建示例数据库*******/
USE master
GO
IF EXISTS(SELECT name FROM sys.databases WHERE name = 'RecordSize_DB')
DROP DATABASE RecordSize_DB
GO
CREATE DATABASE RecordSize_DB
GO
相关文章