SQL Server 2012 - 将2个Varchar(max)列分隔为单独的表?

时间:2015-06-18 14:34:24

标签: sql sql-server database database-design

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

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

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

3 个答案:

答案 0 :(得分:4)

  

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

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

必须回收BLOB空间

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

回收空间

因此,当它归结为细节时,你使用拆分表,imho并没有取得多大成就。所以我坚持我早先从SQL Server varbinary(max) and varchar(max) data in a separate table得到的建议:我认为拆分没有任何好处,但是我觉得必须在拆分之间保持行1:1的一致性。

如果你拆分分区'blobs'表,你可能会遇到这种情况。实际上,您可以通过切换旧分区并将其替换为空分区,然后删除已切换的数据来非常有效地释放旧空间。那个需要考虑的事情。当然,当你加入两个'splits'以考虑blob可能已经消失时(例如,使用OUTER JOIN),你的代码必须足够聪明。

答案 1 :(得分:0)

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

示例:

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

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

您可以详细了解here

答案 2 :(得分:0)

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

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

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

在截断表方面,您还有一个额外的约束。对于许多查询来说,这似乎是一场胜利,所以我认为这会将这些价值放在一个单独的表中。

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