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

2024-02-08

来自我的问题“8060 B 数据页 (SQL Server) 中有 8078 字节? https://stackoverflow.com/questions/3778721/8078-bytes-in-8060-b-datapage-ms-sql-server”其中向我解释了如何在 MS SQL Server 中导出每页 8078 字节的数据。

如果我计算每页用于仅一行和一列非索引固定大小类型记录的数据存储(无开销)的字节数(根据 MSDN 文章估计堆的大小 http://msdn.microsoft.com/en-us/library/ms189124.aspx),然后我得到 8087 字节(每页)。

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

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


存储引擎内部:记录剖析 https://www.sqlskills.com/blogs/paul/inside-the-storage-engine-anatomy-of-a-record/

这是为了SQL Server 2005

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

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

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

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

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

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

我不会太纠结:这些信息已经no日常实用价值

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何达到每行 8060 字节和每个 (varchar、nvarchar) 值 8000 个字节的限制? 的相关文章

随机推荐