根据SQL Server 文档,看起来如果我有一个或多个 varchar/nvarchar 列导致行长度超过 8KB,SQL Server 会神奇地处理它。
场景:
- 表有 100
列 - 当前最大行长度为 3.4KB
- 但是如果每个 varchar/nvarchar 字段都填充到最大值,行长度将达到 14kb
从我对上面链接的联机丛书详细信息的解释来看,这种情况会很顺利(例如,什么都不会中断,一切都会正常进行)。
我的假设是真的吗?
根据SQL Server 文档,看起来如果我有一个或多个 varchar/nvarchar 列导致行长度超过 8KB,SQL Server 会神奇地处理它。
场景:
- 表有 100
列 - 当前最大行长度为 3.4KB
- 但是如果每个 varchar/nvarchar 字段都填充到最大值,行长度将达到 14kb
从我对上面链接的联机丛书详细信息的解释来看,这种情况会很顺利(例如,什么都不会中断,一切都会正常进行)。
我的假设是真的吗?
使用未记录的功能
DBCC IND
和DBCC PAGE
,您可以很容易地准确知道 SQL Server 对超过 8,060 字节“最大”大小的行做了什么。为了展示这是如何工作的,我将在 tempdb 中创建一个简单的表,其中行宽为 10,000 字节,然后运行
DBCC IND
以获取存储数据的页面列表。然后我们将运行DBCC PAGE
以查看这些页面的内容。首先,我们创建最大宽度为 10,000 字节的表:
并用一行填充它:
这里我们创建一个表来保存
DBCC IND
输出,并填充该表:最后,此游标遍历表的内容,
dbo.IndexDetails
显示表使用的每个页面的页面内容:游标的有趣输出位显示在 SSMS 的“消息”选项卡上。
这是第一页。注意
Record Type = PRIMARY_RECORD
:我已经删除了实际页面转储的十六进制内容,以将我的帖子保持在 30,000 个字符的限制之内。正如您从上面的页面转储中看到的那样,我的示例中的主页面不包含前 3 列,
A
它们存储在行溢出区域中,如下所示,B
其中:C
Record Type = BLOB_FRAGMENT