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

Gen*_*нин 3 sql-server memory-management data-storage data-structures

从我的问题" 8060 B数据空间(SQL Server)中的8078字节? "开始,向我解释了如何在MS SQL Server中每页导出8078字节的数据.

如果我计算每页用于数据存储的字节数(没有开销),只有一行有一列非索引的固定大小类型记录(根据MSDN文章估计堆的大小),那么我来了到8087字节(每页).

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

我当然缺少存储分配方面的东西:管理的块越少,开销就越大......

gbn*_*gbn 6

在存储引擎内部:记录的剖析

这适用于SQL Server 2005

  • 记录标题
    • 4个字节长
    • 两个字节的记录元数据(记录类型)
    • 在记录中向前指向NULL位图的两个字节
  • 记录的固定长度部分,包含存储具有固定长度的数据类型的列(例如bigint,char(10),datetime)
  • NULL位图
    • 记录中列数的两个字节
    • 记录中每列存储一位的可变字节数,无论该列是否可为空(这与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?创建此表时会收到警告

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

  • 如果您从事数据仓库工作,这具有很多实用的日常价值.确定适合页面的十亿行事实表的行数是计算存储增长所必须的练习. (2认同)