3

来自我的问题“ 8060 B 数据页(SQL Server)中的 8078 字节? ”向我解释了如何在 MS SQL Server 中导出每页 8078 字节的数据。

如果我计算每页用于数据存储的字节数(没有开销),其中只有一行和一列非索引固定大小类型记录(根据 MSDN 文章Estimating the Size of a Heap),那么我来了到 8087 字节(每页)。

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

我肯定在存储分配中遗漏了一些东西:要管理的块越少,开销就越大......

4

2 回答 2

6

存储引擎内部:记录剖析

这适用于SQL Server 2005

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

所以,对于一个 char(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?创建此表时收到警告

我不会太挂念它:这些信息没有实际的日常价值

于 2010-09-25T09:44:52.627 回答
1

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

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

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

于 2010-09-25T14:12:39.287 回答