【问题标题】:SQL Server maximum 8KB per row?SQL Server 每行最大 8KB?
【发布时间】:2011-05-22 05:26:19
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql-server-2008 max capacity-planning


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      是的,您将在 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 子表

      【讨论】:

      • 它不一定是要被推送到另一个页面的最大列,但是,我相信它们会自动以这种方式处理。如果超出限制,最大的列将被推送到另一个页面。我还要注意,只有当您的数据实际超过 8060 字节限制时,而不是当列大小的总和超过时。当这种情况发生时重新考虑你的架构是一个好主意,但如果它很少发生,让 SQL Server 处理它也可能是一个可行的选择。对于 OPs 示例,单独存储每个文档并保留一个连接表来存储 N 个文档可能会更好。
      • 是的。这是我认为的 SQL Server 2000 行为(CREATE TABLE 上的警告,INSERT 或 UPDATE 上的错误)。 SQL Server 2008 将处理溢出。
      • @tvanfosson:是的,它基本上是无声的和自动的,尽管它可以为 sp_tableoption 配置“大值类型 out of row”选项。 @Martin:我忘记了:从 SQL Server 2005 开始。
      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2013-04-12
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 2017-10-09
      相关资源
      最近更新 更多