SQL Server 2012 - 分隔 2 个 Varchar(max) 列以分隔 table?

SQL Server 2012 - Separate 2 Varchar(max) columns to separate table?

如果 SQL Server 2012 table 有 2 varchar(max) 列很少使用并导致 table 快速增长,拆分成是否有意义一个单独的table?

两个 varchar(max) 列中的数据用于存储来自 API 的原始 JSON 响应。

如果存储在单独的 table 中,行将被截断为仅包含前 6 个月,从而减少第一个 table 的 table 大小。

只是给你一个提示。您可以在很少使用的列上使用 SPARSE

示例:

CREATE TABLE myTable (
    id int identity(1,1),
    name nvarchar(100),
    blob nvarchar(max) SPARSE,
    blob2 nvarchar(max) SPARSE
)

Sparse 只会在页面内留下一个小标记。但是拥有 nvarchar(max) 主要是不好的做法。真的需要吗?

您可以阅读更多相关信息 here

这个 question 几乎是重复的,但不完全是。

在很大程度上,varchar(max) 列存储在页外。如果您不在查询中引用它们,则不会加载它们。因此,它们提供的额外开销很少。

如果值存储在同一页上,情况就不同了。然后删除它们 可以 缩小 table 的大小,更少的页面对于 select 查询应该更快。 Here 是一个关于这个主题的有趣博客。

在截断 table 方面,您还有一个额外的限制。对于许多查询来说,这似乎是一个胜利,所以我认为这提示了将值放在单独的 table.

中的论点

但是请注意,截断并不是唯一可能的解决方案。您还可以对数据进行分区(比如按月或周)。如果分区键是所有查询的一部分,那么您可以使用分区而不是截断,还可以减少 table.

的有效大小

If stored in a separate table, rows would be truncated to only include previous 6 months, reducing table size of first table.

行必须被删除,而不是被截断,然后 BLOB space 必须被 运行 ALTER INDEX ... REORGANIZE WITH (LOB_COMPACTION = ON)

回收

如果您要将 blob 存储在原始 table 中,则必须将行更新为 SET blob = NULL,然后使用 ALTER INDEX ... REORGANIZE WITH (LOB_COMPACTION = ON) 回收 space

所以当它归结为细节时,使用拆分 table 并没有取得多大成就,恕我直言。所以我坚持我之前来自 SQL Server varbinary(max) and varchar(max) data in a separate table 的建议:我认为拆分没有任何好处,但我发现必须在拆分之间保持行一致 1:1 会带来麻烦。

如果您拆分并分区 'blobs' table,您可能会遇到这种情况。然后,您实际上可以通过切换 'out' 旧分区并将它们替换为空分区,然后删除切换出的数据,非常有效地释放旧 space 。 需要考虑的事情。当然,您的代码在连接两个 'splits' 时必须足够聪明,以考虑 blob 可能会消失(即。使用 OUTER JOIN)。