【问题标题】:SQL Server 2012 - Separate 2 Varchar(max) columns to separate table?SQL Server 2012 - 将 2 个 Varchar(max) 列分隔为单独的表?
【发布时间】:2015-09-04 06:25:06
【问题描述】:

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

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

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

【问题讨论】:

  • 是的,出于多种原因,这很有意义。如果您有这样的临时数据,它不属于永久/历史表,
  • “有意义”不等于“应该做”。我们不知道您的实施、可用资源、规模等。只有您可以确定。
  • DavidG,您需要了解哪些具体信息才能进行推荐?

标签: sql sql-server database database-design


【解决方案1】:

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

例子:

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

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

您可以阅读更多关于它的信息here

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      如果您拆分并分区“blob”表,您可能会遇到问题。然后,您确实可以通过“切换”旧分区并用空分区替换它们,然后删除切换出的数据来非常有效地释放旧空间。这 需要考虑的事情。当然,当你的代码加入两个“分裂”时,你的代码必须足够聪明,才能考虑到 blob 可能已经消失(例如,使用 OUTER JOIN)。

      【讨论】:

      • 考虑到当前大小为 250GB+,对表分区是否有任何顾虑?当前使用主文件组以及数据库中的所有其他表。
      • 您只需要对“blob”表进行分区。要构建此 blob 表,您需要一些过程来复制 blob,这将是缓慢且离线的(需要服务停机时间、不可用)。当你做这个拆分时,你可以很容易地直接拆分成一个分区表,之后不需要分区。
      • 如果我们采用第一种方法(不理会表),对就地分区有任何顾虑吗?
      • 您的意思是在新的分区方案上重建表?是重建,您需要考虑重建停机时间,并且需要在重建期间为数据和日志提供所需的磁盘空间。但是为什么要对整个(所有列)表进行分区呢?
      • 因为它很大并且与所有其他表在同一个文件组中。认为在单独的文件组中分解成较小的文件是有意义的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-27
      • 2022-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-09
      相关资源
      最近更新 更多