繁体   English   中英

SQL Server 2012-将2个Varchar(max)列分开以分开表吗?

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

如果SQL Server 2012表具有2个varchar(max)列,这些列很少使用并且导致表快速增长,那么将其拆分为一个单独的表是否有意义?

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

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

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

必须删除行而不是将其截断,然后必须通过运行ALTER INDEX ... REORGANIZE WITH (LOB_COMPACTION = ON)来回收BLOB空间ALTER INDEX ... REORGANIZE WITH (LOB_COMPACTION = ON)

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

因此,当涉及到细节时,使用拆分表imho并不会取得太大的成就。 因此,我坚持使用SQL Server varbinary(max)和varchar(max)数据在单独表中的早期建议:在拆分中看不到任何好处,但是在拆分之间必须保持行1:1一致时会遇到麻烦。

如果拆分并分区 “ blobs”表,则可能会有情况。 然后,您确实可以通过切换“出”旧分区并将其替换为空分区,然后删除已切换出的数据,非常有效地重新分配旧空间。 要考虑的事情。 当然,当代码加入两个“拆分”时,您的代码必须足够聪明以考虑斑点可能消失了(例如,使用OUTER JOIN)。

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

例:

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

稀疏将在页面内留下一个小标记。 但是拥有nvarchar(max)通常是不好的做法。 真的需要吗?

您可以在此处了解更多信息。

这个问题几乎是重复的,但并非完全相同。

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

如果这些值存储在同一页面上,情况将有所不同。 然后删除它们可以缩小表的大小,并且更少的页面应该更快地用于select查询。 是有关此主题的有趣博客。

就截断表而言,您还有其他约束。 对于许多查询来说,这似乎是一个胜利,所以我认为这提示了将值放在单独表中的论点。

但是请注意,截断不是唯一可能的解决方案。 您还可以对数据进行分区(例如按月或周)。 如果分区键是所有查询的一部分,则可以使用分区代替截断,还可以减小表的有效大小。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM