存档大表(SQL Server 2008)

PyQ*_*yQL 5 sql sql-server sql-server-2008

我有一张非常大的桌子,每个季度都有大约100万条记录.

我使用此脚本手动将数据从现有表移动到另一个数据库,以最小化备份大小,并在执行查询时卸载生产数据库.

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

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

谢谢

bri*_*ian 7

让我回顾一下这些要求:

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

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

对于日志记录,您将需要查看最小日志记录规则并确保您遵循它们.确保要插入的数据库的恢复模型位于简单或大容量日志恢复模型中.

要插入存档数据,您需要禁用非群集(并在插入完成后重建它们),如果存在聚簇索引则使用跟踪标志610,并在目标表上放置表锁.您要检查的链接中有更多规则,但这些是基础知识.

删除没有最小日志记录,但您可以通过使用top子句删除块来最小化日志文件增长.基本思路是(在删除期间切换到简单恢复模型以限制文件增长):

SELECT NULL;

WHILE @@ROWCOUNT > 0

     DELETE TOP (50000) FROM TABLE WHERE Condition = TRUE;
Run Code Online (Sandbox Code Playgroud)

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

如果你真的想要最少的日志记录,你可以按周划分源表,创建源表的克隆(在相同的分区函数和相同的索引结构上),将分区从源表切换到克隆表,插入从克隆表到存档表,然后截断克隆表.这样做的好处是截断而不是删除.缺点是设置,维护和查询要复杂得多(每个分区有一个堆或b树,所以如果所有查询都不利用分区消除,则聚簇索引/表扫描必须扫描多个b -trees/heaps而不仅仅是一个).