tay*_*201 13 sql sql-server sql-server-2012
我创建了一个包含列类型的表nvarchar(max)
,我的理解是它们可以支持2GB.但是在插入时,我仍然收到此错误:
无法创建大小为8061的行,该行大于允许的最大行大小8060.
是否需要对数据库进行全局设置,还是有其他限制?varchar(max)
每个表的字段数是否有限制?
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 位指针,从而绕过了这一限制。
我建议将您的表标准化为一个或多个相关表。
归档时间: |
|
查看次数: |
24301 次 |
最近记录: |