SQL Server最大行大小Vs Varchar(Max)大小

时间:2016-04-23 00:23:01

标签: sql-server sql-server-2008

我正在尝试估算SQL Server 2008 R2的数据库大小。我的表格包含一个INTEGER主键和39个VARCHAR(MAX)类型的文本列。

我搜索并发现了两个陈述。

  • 每行最多可包含8,060个字节。
  • Varchar(max)的最大存储容量为2千兆字节。

我很难估计大小。如果对行有限制,如何在每列中存储2千兆字节?

我不是数据库专家可能是我没有正确使用它。

任何人都可以解释如何估计吗?

谢谢

2 个答案:

答案 0 :(得分:2)

在Microsoft SQL Server中,数据(包括索引)存储在一个或多个8k(8192字节)"页面"中。可以使用不同类型的页面来处理各种情况(例如,数据,LOB,索引,分配映射等)。每个页面都有一个标题,该标题是关于该页面及其包含内容的元数据。

大多数数据都存储在行本身中,并且这些行中的一个或多个依次存储在"行内数据"的页面中。由于行标题占用的空间,最大的行可以是(对于"行内"数据)是8060字节。

但是,并非所有数据都存储在行中。对于某些数据类型,数据实际上可以存储在" LOB数据上。指针留在"行内"数据:

  • 默认情况下,任何人都不应该使用的旧版/弃用LOB类型(TEXTNTEXTIMAGE)始终将其数据存储在LOB页面上使用一个16字节指针指向该LOB页面。

  • 默认情况下,较新的LOB类型(VARCHAR(MAX)NVARCHAR(MAX)VARBINARY(MAX)XML)会尝试直接在行中拟合数据如果它适合。否则,它会将数据存储在LOB页面上,并使用24-72字节的指针(取决于LOB数据的大小)。

这是你可以在一行中存储多达78 GB + 4字节(不能忘记INT主键;-)的方法:最大行大小将在940字节之间( (39 * 24)+ 4)和2812字节((39 * 72)+ 4)。但同样,这只是最大范围;如果39 VARCHAR(MAX)个字段中的每个字段中的数据只有10个字节,则所有数据将存储在行中,行大小将为394字节((39 * 10)+ 4)。

鉴于您有这么多可变长度字段(无论它们是否为MAX),估计未来行大小的唯一方法是很好地了解您将在此表中存储哪些数据。虽然,包含所有或甚至大多数MAX数据类型的表意味着没有人真正知道将在此表中存储什么。

在这些方面,应该指出这是一个可怕的模型表/可能使用MAX数据类型字段,应该重构。

有关数据页面结构的更多详细信息,请参阅以下DBA.StackExchange问​​题的答案:

SUM of DATALENGTHs not matching table size from sys.allocation_units

答案 1 :(得分:1)

使用Varchar(MAX)时,数据可以存储在行中(称为页面)(如果内容大于< 8000字节)。如果内容是> 8000字节,则数据被存储为LOB(“离开页面”),并且仅在页面内存储对实际位置的引用。老实说,我不知道有任何合适的方法来估计整个数据库的大小,考虑到数据可能是Varchar(MAX)列中的任何长度。