Sql server SQL Server最大行大小Vs Varchar(最大)大小

Sql server SQL Server最大行大小Vs Varchar(最大)大小,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我正在尝试估计SQL Server 2008 R2的数据库大小。我有一个表,其中有一个INTEGER主键和39个VARCHAR(MAX)类型的文本列 我搜索并找到了两个陈述 表每行最多可包含8060字节 Varchar(max)的最大存储容量为2 GB 我对估计尺寸感到困惑。如果行有限制,如何在每列中存储2G字节 我不是数据库专家,可能是我没有正确地理解它 有人能解释一下怎么估计吗 谢谢当您使用Varchar(MAX)时,数据可以存储在行中(称为页面)(如果内容为8000字节,则数据存储为L

我正在尝试估计SQL Server 2008 R2的数据库大小。我有一个表,其中有一个
INTEGER
主键和39个
VARCHAR(MAX)
类型的文本列

我搜索并找到了两个陈述

  • 表每行最多可包含8060字节
  • Varchar(max)
    的最大存储容量为2 GB
我对估计尺寸感到困惑。如果行有限制,如何在每列中存储2G字节

我不是数据库专家,可能是我没有正确地理解它

有人能解释一下怎么估计吗


谢谢

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

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

大多数数据存储在行本身中,其中一行或多行依次存储在“行内数据”页面中。由于行标题占用的空间,行的最大值(对于“行内”数据)为8060字节

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

  • 默认情况下,任何人都不应再使用的旧的/不推荐的LOB类型(
    TEXT
    NTEXT
    、和
    IMAGE
    )始终将其数据存储在LOB页面上,并且始终使用指向该LOB页面的16字节指针

  • 较新的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问题的回答:


您是否看到了这个链接,我希望它能对您有所帮助。您是想获得当前的大小,还是想知道如果添加一定数量的行,它可以有多大?像
VARCHAR(MAX)
VARBINARY(MAX)这样的“大”数据类型
的处理方式与其他数据类型不同。由于它们最多可以有2GB的数据,因此可能会跨越整个“溢出”页面。在这种情况下,它们将在“基本”数据页面上占用一定数量的存储空间(在某个地方有文档记录,现在还不知道),而
int
datetime
等的其他列则占用基础上的固定存储量page@srutzky我想知道它有多大。这取决于列要存储的内容。一行可以存储140字节,另一行可以存储78 GB字节,这取决于数据。Soloman,你有这样的链接吗描述您提到的24-72字节的开销?我这样问是因为我做了一些测试,发现这非常正确,而且存储的不仅仅是16字节指针。Hi@JeffModen。对,16字节指针主要用于不推荐的LOB类型(
IMAGE
TEXT
,和
NTEXT
),但如果使用
sp_tableoption
设置行中的
文本(不确定有多少人知道该选项),则情况并非总是如此或者,另一种不常见的情况是使用
sp_tableoption
MAX
类型设置
行外的大值
,这导致它们总是使用16字节指针。但请查看我答案末尾的链接,因为它指向我的更详细答案,我刚刚更新了更多关于这方面的详细信息,以及一个外部参考和测试脚本。谢谢Soloman。我在@JeffModen上找到了Mark S.Rasmussen的一个链接,所以,你没有看到我的另一个答案链接在这个答案的底部?;-)不仅是另一个答案中的同一个链接,而且我还添加了一些在Mark的博客帖子中没有提到的细节(还有一个指向测试脚本的链接,可以引导您了解其中的大部分内容)。此外,我发现内联根的上限为42000,而Mark的帖子指出上限仅为40000。这里的答案只是基于其他答案的一部分的摘要。请查看其他答案(“数据长度总和…”链接).不…我当然没有。你所指的链接标题中没有任何东西表明我在寻找任何东西,链接上方的描述说它是f