SQL Server 2012中的最大行大小,带有varchar(max)字段

tay*_*201 13 sql sql-server sql-server-2012

我创建了一个包含列类型的表nvarchar(max),我的理解是它们可以支持2GB.但是在插入时,我仍然收到此错误:

无法创建大小为8061的行,该行大于允许的最大行大小8060.

是否需要对数据库进行全局设置,还是有其他限制?varchar(max)每个表的字段数是否有限制?

Ban*_*yan 9

SQL Server使用页面来存储数据.页面大小为8kb.

因此SQL Server中的记录大小(行大小)不能大于8060字节.

如果数据未安装在8060字节中,则使用参考指针. 当varchar,nvarchar,varbinary,sql_variant或CLR用户定义类型列的组合超出此限制时,SQL Server数据库引擎将具有最大宽度的记录列移动到ROW_OVERFLOW_DATA分配单元中的另一个页面,同时保持24-原始页面上的字节指针.

将大型记录移动到另一个页面会动态发生,因为记录会根据更新操作延长.缩短记录的更新操作可能会导致记录移回IN_ROW_DATA分配单元中的原始页面.

此外,查询和执行其他选择操作(例如对包含行溢出数据的大型记录进行排序或连接)会减慢处理时间,因为这些记录是同步处理的,而不是异步处理的.

使用稀疏列的表的记录大小限制为8,018字节.当转换的数据加上现有记录数据超过8,018字节时,将返回MSSQLSERVER ERROR 576.在稀疏类型和非稀疏类型之间转换列时,数据库引擎会保留当前记录数据的副本.这会暂时使记录所需的存储空间翻倍..

要获取有关可能包含行溢出数据的表或索引的信息,请使用sys.dm_db_index_physical_stats动态管理功能.


小智 1

这来自 StackOverflow 上的一个早期线程,可以在此处找到:

无法创建大小为 8937 的行,该行大于允许的最大值 8060

导致该错误的原因是 SQL Server 中不能有大于 8KB(1 页大小)的行,因为行不允许跨页 - 这是 SQL Server [...]

请注意,SQL Server 将允许您创建表,但是如果您尝试实际插入跨多个页面的任何数据,则会出现上述错误。当然,这并不完全合理,因为如果以上是全部事实,那么单个 VARCHAR(8000) 列将填充表中的一行!(过去就是这样)。SQL Server 2005 允许将行中的某些数据存储在另一个页中,而不是保留 24 位指针,从而绕过了这一限制。

我建议将您的表标准化为一个或多个相关表。