如何达到每行8060个字节的限制和每个(varchar,nvarchar)值8000的限制?

问题描述 投票:3回答:2

来自我的问题“ 8078 bytes in 8060 B datapage (SQL Server)?”,其中向我解释了如何在MS SQL Server中获取每页8078字节的数据。

如果我计算仅一页的数据存储(无开销)每页的字节数(其中不包含固定索引类型记录的一列(根据MSDN文章Estimating the Size of a Heap),那么我来8087字节(每页)。

[如何在不购买和研究1000多页的书的情况下,达到每行8060字节的限制(在其他问题的答案中提到)和每行(varchar,nvarchar)的8000字节的限制?

我当然在存储分配中缺少一些东西:要管理的块越少,开销就越大...

sql-server data-structures memory-management data-storage
2个回答
6
投票

Inside the Storage Engine: Anatomy of a record

这是SQL Server 2005

  • 记录头
    • 4个字节长
    • 记录元数据的两个字节(记录类型)
    • 记录中指向空位图的两个字节
  • 记录的固定长度部分,包含存储具有固定长度的数据类型的列(例如,bigint,char(10),datetime)
  • NULL位图
    • 两个字节用于记录中的列数
    • 要在记录中每列存储一位的可变字节数,而不管该列是否可为空(这比SQL Server 2000(仅对每个可为空的列具有一位的SQL Server 2000不同且更简单)
    • 这允许在读取为NULL的列时进行优化
  • 可变长度列偏移数组
    • 用于可变长度列的计数的两个字节
    • 每可变长度列两个字节,为列末尾的值提供偏移量版本标记
  • 仅在SQL Server 2005中,并且是一个14字节的结构,其中包含时间戳以及指向tempdb中版本存储的指针

所以,对于一个字符(8000)

  • 4字节(记录头)
  • 8000定长
  • 3空位图
  • 2个字节以计数可变长度
  • 14时间戳记

但是,如果您有40个varchar(200)列

  • 4字节(记录头)
  • 0固定长度
  • 6个空位图
  • 2个字节以计数可变长度
  • 202 x 40 = 8080
  • 14时间戳记

总计= 8080 + 4 + 6 + 2 + 14 =8106。WTF?创建此表时,您会收到警告

我不会太挂了:该信息具有no实际的日常价值


1
投票

我不确定您要问的是什么,但是如果您的问题是“为什么最大行长是8060字节而不是其他一些数字?”或“为什么NVARCHAR的最大行长是8000字节?”那么简短的答案是,谁知道呢? (正如gbn所说,谁在乎?)

所有MSSQL限制-数据类型大小,最大行大小,每个表的列,每个索引的列等-只是Microsoft的设计决策。我非常确定,决策背后有大量的工程文档,但是大多数人无法访问该信息。

如果您对限制的具体细节,行大小的计算方式等感兴趣,那么阅读MSSQL文档是最好的起点。

© www.soinside.com 2019 - 2024. All rights reserved.