如果SQL Server 2012表有2个varchar(max)
列很少使用并导致表快速增长,那么拆分成单独的表是否有意义?
两个varchar(max)
列中的数据用于存储来自API的原始JSON响应。
如果存储在单独的表中,行将被截断为仅包括前6个月,从而减少第一个表的表大小。
答案 0 :(得分:4)
如果存储在单独的表中,行将被截断为仅包括前6个月,从而减少第一个表的表大小。
必须删除行,而不是截断,然后运行ALTER INDEX ... REORGANIZE WITH (LOB_COMPACTION = ON)
如果您将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是一个关于这个主题的有趣博客。
在截断表方面,您还有一个额外的约束。对于许多查询来说,这似乎是一场胜利,所以我认为这会将这些价值放在一个单独的表中。
但请注意,截断不是唯一可行的解决方案。您还可以对数据进行分区(例如按月或按周)。如果分区键是所有查询的一部分,那么您可以使用分区而不是截断,并减少表的有效大小。