SQL Server 堆表行存储大小(Record Size)

2022-11-03 00:00:00 记录 字节 可变 大小 长度

一.本文所涉及的内容(Contents)

  1. 本文所涉及的内容(Contents)
  2. 背景(Contexts)
  3. 堆表行记录存储格式(Heap)
  4. 案例分析(Case)
  5. 参考文献(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

相关文章