1

我只是碰巧阅读了SQL Server 2008 的最大容量规范并看到每行最多 8060 字节?什么...每行只允许 8KB?(是的,我看到了“行溢出存储”特殊处理,我说的是标准行为)

我在这里误解了什么吗?我确定我有,因为我确定我看到了存储在 SQL Server 数据库中的具有几 MB 大小的二进制对象。这种不祥的每行真的意味着一个表格行,就像一行,多列吗?

因此,当我有三nvarchar列,每列 4000 个字符时(假设三个法律文件写在文本框中......) - 服务器会发出警告吗?

4

2 回答 2

3

是的,您会在 CREATE TABLE 上收到警告,在 INSERT 或 UPDATE 上收到错误

LOB 类型(nvarchar(max)、varchar(max) 和 varbinary(max))允许 2Gb-1 字节,这是您存储大块数据的方式,也是您以前见过的。

  • 对于单个字段 > 4000 个字符/8000 个字节,我会使用 nvarchar(max)

  • 对于一行中的 3 x nvarchar(4000),我会考虑以下之一:

    • 我的设计是错误的
    • nvarchar(max) 用于一列或多列
    • “最少填充”列的 1:1 子表
于 2010-12-08T13:08:42.600 回答
1

2008 将处理溢出,而在 2000 中,它将简单地拒绝插入溢出的记录。但是,最好在设计时考虑到这一点,因为大量记录溢出可能会导致查询时出现一些性能问题。在您描述的情况下,我可能会考虑一个相关表,其中包含文档类型列、文档大字段和初始表的外键。但是,如果不太可能将所有三列都填充到同一记录中或以最大值填充,那么设计可能没问题。您必须了解您的数据才能确定哪个是最好的。另一个考虑是像现在一样继续,直到出现问题,然后用单独的文档表替换。您甚至可以通过重命名现有表并创建一个新表,然后使用现有表名创建一个视图来从新结构中提取数据来进行重构。尽管您仍然需要调整任何插入或更新语句,但这可以防止您的许多代码中断。

于 2010-12-08T14:19:48.313 回答