【问题标题】:Archiving Large Table (SQL Server 2008)归档大表 (SQL Server 2008)
【发布时间】:2013-10-17 18:55:42
【问题描述】:

我有一个非常大的表,每个季度都有大约 100 万条记录。

我使用 this script 手动将数据从现有表移动到另一个数据库,以最小化备份大小,并在执行查询时减轻生产数据库的负载。

有没有更好的方法,例如,一些计划脚本将数据从生产数据库移动到其他数据库,然后每天或每周有效地从源数据库中删除记录?

请注意,由于此表中的大量 INSERT,我的日志文件正在快速增长,而且当我将数据移动到存档数据库时,将记录 DELETE。

谢谢

【问题讨论】:

  • 避免分区有什么原因吗?这似乎是一个完美的用例。我不是 SQLServer 分区专家,所以我会让其他人了解细节,但是对于这种大小,交换分区似乎是最好的解决方案。

标签: sql sql-server sql-server-2008


【解决方案1】:

让我回顾一下要求:

  1. 减小备份大小
  2. 通过归档减少数据库中的记录数
  3. 归档数据而不需要过多的记录

为了减少备份大小,您需要将数据移动到不同的数据库中。

就日志记录而言,您需要查看rules of minimal logging 并确保您关注它们。确保您要插入的数据库的恢复模式是简单或大容量日志恢复模式。

为了插入归档数据,您希望禁用非聚集数据(并在插入完成后重建它们),如果有聚集索引,则使用跟踪标志 610,并在目标表上放置表锁。链接中还有许多您需要检查的规则,但这些是基本规则。

删除没有最小的日志记录,但是您可以通过使用 top 子句逐块删除来最大程度地减少日志文件的增长。基本思想是(在删除期间切换到简单恢复模式以限制文件增长):

SELECT NULL;

WHILE @@ROWCOUNT > 0

     DELETE TOP (50000) FROM TABLE WHERE Condition = TRUE;

调整顶部数字以调整每次删除完成的记录量。您还需要确保谓词条件正确,以便您只删除您打算删除的内容。这将删除50000,然后如果返回一个rowcount,它将重复,直到返回的rowcount为0。

如果您真的希望所有内容的日志记录最少,您可以按周对源表进行分区,创建源表的克隆(在相同的分区函数和相同的索引结构上),将分区从源表切换到克隆表,从克隆表插入到存档表,然后截断克隆表。这样做的好处是截断而不是删除。缺点是设置、维护和查询要复杂得多(每个分区都有一个堆或 b-tree,所以如果所有查询都不使用分区消除,聚集索引/表扫描将不得不扫描多个 b -trees/heaps 而不仅仅是一个)。

【讨论】:

    【解决方案2】:

    您是否考虑过使用 SSIS 来执行此操作。我使用 SSIS 按顺序进行归档和备份。您还可以在 tsql 任务中使用相同的脚本并使用代理对其进行调度。或者您可以只使用代理并将脚本粘贴到其中。

    【讨论】:

      【解决方案3】:

      分区,当然。它将消除对新数据库的需求。好例子here

      如果你不想改变你的架构,我建议使用 SSIS 来移动数据而不是脚本

      【讨论】:

      • 我喜欢为存档进行分区,并认为这是解决方案的一部分,但这不会减少作为 OP 要求之一的备份大小。
      【解决方案4】:

      您可以使用表分区而不是移动数据

      http://technet.microsoft.com/en-us/library/dd578580(v=sql.100).aspx

      http://msdn.microsoft.com/en-us/library/ms345146(v=sql.90).aspx

      为了定期移动数据,您可以使用 SQL Server 作业调度功能来运行 SSIS 包。

      也许也可以使用数据转换服务 (DTS)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-17
        • 1970-01-01
        • 2017-02-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多