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

时间:2013-10-08 14:48:57

标签: sql sql-server sql-server-2012

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

  

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

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

3 个答案:

答案 0 :(得分:8)

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 :(得分:3)

从SQL Server文档:

  

各列的长度仍必须在限制范围内   varchar,nvarchar,varbinary,sql_variant和CLR的8,000字节   用户定义的类型列。 只有他们的组合长度才能超过   表格的8,060字节行限制。

     

其他数据类型列的总和,包括char和nchar数据,   必须在8,060字节的行限制范围内。大对象数据也是   免于8,060字节的行限制。

此处有更多信息:https://technet.microsoft.com/en-us/library/ms186981%28v=sql.105%29.aspx

答案 2 :(得分:0)

这来自StackOverflow上的早期帖子,可以在这里找到:

Cannot create a row of size 8937 which is greater than the allowable maximum of 8060

  

导致错误是因为SQL服务器中的行不能超过8KB(1页的大小),因为不允许行跨页 - 这是SQL Server的基本限制[...] < / p>      

请注意,SQL Server将允许您创建表,但是如果您尝试实际插入跨越多个页面的任何数据,那么它将给出上述错误。   当然这并没有完全相加,因为如果以上是全部真相,那么单个VARCHAR(8000)列将填充表中的一行! (过去就是这种情况)。 SQL Server 2005通过允许来自行的某些数据存储在另一个页面中而改为保留24位指针来解决此限制。

我建议将您的表规范化为一个或多个重新关联的表。