gpt4 book ai didi

sql-server - SQL Server 最大行大小与 Varchar(Max) 大小

转载 作者:行者123 更新时间:2023-12-02 05:01:02 24 4
gpt4 key购买 nike

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

我搜索了一下,发现了两种说法。

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

我对估计尺寸感到困惑。如果行有限制,如何在每列中存储 2 GB?

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

谁能解释一下如何估算?

谢谢

最佳答案

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

大多数数据存储在行本身中,并且这些行中的一个或多个又存储在“行内数据”的页面中。由于行标题占用的空间,最大行(对于“行内”数据)为 8060 字节。

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

  • 默认情况下,任何人都不应再使用旧版/已弃用的 LOB 类型(TEXTNTEXTIMAGE),始终将数据存储在 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),估计 future 行大小的唯一方法是充分了解您将在此表中存储哪些数据。尽管如此,包含所有甚至大部分 MAX 数据类型的表意味着没有人真正知道该表中将存储什么内容。

沿着这些思路,应该指出这是一个可怕的建模表/MAX 数据类型字段的可怕使用,应该重构。

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

SUM of DATALENGTHs not matching table size from sys.allocation_units

关于sql-server - SQL Server 最大行大小与 Varchar(Max) 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36805169/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com