无法创建大于允许的最大行大小 8060 的大小为 11842 的行

Ete*_*num 3 sql-server-2016

可疑表有 299 个 nvarchar(max) 列、1 个整数列和 1 个 nvarchar(255) 列。请不要问我为什么,这是第 3 方供应商数据库。无论如何,根据我的数学计算,在最坏的情况下,我们应该在 8060 限制范围内:

24x299 + 4 + 510 = 7690

在使用供应商的导入工具的导入过程中,从外部源插入失败并出现上述错误。我在计算中遗漏了什么吗?11842 可能来自哪里?有任何想法吗?

谢谢!

Wor*_*DBA 5

这取决于如何VARCHAR(MAX)NVARCHAR(MAX)实际存储数据的实施。如果每列需要存储的字节数小于或等于 8000 字节,则数据将存储在行中,如果大于 8000 字节,则将其存储在 LOB 页中。发生这种情况时,该行会保存一个指向实际包含数据的 LOB 页的指针。

因此,向后工作,尝试存储在每列中的数据的平均长度为:

(11842 - (4 + 510)) / 299 = 38(大约字节/19 个字符)

由于每列的值低于 8000 字节的限制,它将尝试将数据存储在行中,因此超出了页面的限制。

您可以查看sys.dm_db_index_physical_stats以了解实际存储的行内与 LOB 页面的数量。此外,SQL Hints有一篇不错的文章,涵盖了基础知识。

由于您可能坚持使用此供应商数据库以及正在导入的数据,因此您可以使用以下命令强制对表中的所有 nvarchar(max) 列进行行外存储:

EXEC sp_tableoption 'dbo.mytable', 'large value types out of row', 1;
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用`EXEC sp_tableoption 'dbo.mytable', 'large value types out of row', 1;` 强制 nvarchar(max) 的行外存储 (2认同)