Sql server 2008 SQL Server每行最大8KB?

Sql server 2008 SQL Server每行最大8KB?,sql-server-2008,max,capacity-planning,Sql Server 2008,Max,Capacity Planning,我碰巧读了,看到每行最多8060字节?什么是。。。每行只允许8KB?(是的,我看到了“行溢出存储”的特殊处理,我说的是标准行为) 我是不是误解了什么?我确信我看到了,因为我确信我看到了SQL Server数据库中存储了几MB大小的二进制对象。这一不祥的每行真的意味着一行多列的表行吗 因此,当我有三个nvarchar列,每个列中有4000个字符(假设三个法律文档写在文本框中…),服务器会发出警告?是的,您会在创建表时收到警告,在插入或更新时收到错误 LOB类型(nvarchar(max)、varc

我碰巧读了,看到每行最多8060字节?什么是。。。每行只允许8KB?(是的,我看到了“行溢出存储”的特殊处理,我说的是标准行为)

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


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

是的,您会在创建表时收到警告,在插入或更新时收到错误

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

  • 对于大于4000个字符/8000字节的单个字段,我将使用nvarchar(最大值)

  • >P>3×nVARCHAR(4000)在一行中,我会考虑其中一个:

    • 我的设计是错误的
    • 一列或多列的nvarchar(最大值)
    • “最少填充”列的1:1子表

是的,您将在创建表时收到警告,在插入或更新时收到错误

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

  • 对于大于4000个字符/8000字节的单个字段,我将使用nvarchar(最大值)

  • >P>3×nVARCHAR(4000)在一行中,我会考虑其中一个:

    • 我的设计是错误的
    • 一列或多列的nvarchar(最大值)
    • “最少填充”列的1:1子表

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

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

不过,我相信它们是自动处理的。如果超过限制,最大的列将被推到另一页。我还需要注意的是,只有当数据实际超过8060字节限制时,而不是列大小之和超过限制时,才会被推到另一页。重新考虑您的模式是一个错误发生这种情况时,这是一个好主意,但如果这种情况很少发生,让SQL Server处理它也可能是一个可行的选择。对于OPs示例,单独存储每个文档并保留一个连接表来存储N个文档可能更好。是的。我认为这是SQL Server 2000的行为(创建表时出现警告,插入或更新时出现错误).SQL Server 2008将处理溢出。@tvanfosson:是的,它基本上是静默的和自动的,尽管它可以配置为“行外的大值类型”sp_tableoption的选项。@马丁:我忘了这一点:从SQL Server 2005开始。它不必是最大列才能推送到另一个页面,但我相信它们是自动处理的。如果超过限制,最大列将推送到另一个页面。我还注意到,只有当数据实际超过8060字节的限制,而不是列大小之和的限制。当这种情况发生时,重新考虑您的架构是一个好主意,但如果这种情况很少发生,让SQL Server处理它可能也是一个可行的选择。对于OPs示例,单独存储每个文档并保留一个连接表来存储N个文档可能更好。是的。这是我认为是SQL Server 2000的行为(创建表时出现警告,插入或更新时出现错误)。SQL Server 2008将处理溢出。@tvanfosson:是的,它基本上是静默和自动的,尽管它可以为sp_TABLE选项配置“行外的大值类型”选项。@Martin:我忘了这一点:从SQL Server 2005开始。