繁体   English   中英

存档大表(SQL Server 2008)

[英]Archiving Large Table (SQL Server 2008)

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

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

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

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

谢谢

让我回顾一下这些要求:

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

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

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

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

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

SELECT NULL;

WHILE @@ROWCOUNT > 0

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

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

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

你有没有考虑使用SSIS来做到这一点。 我使用SSIS在订单中进行存档和备份。 您还可以在tsql任务中使用相同的脚本,并使用代理程序对其进行计划。 或者您可以使用代理并将脚本放入其中。

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

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)也可以使用。

绝对是分区。 它将消除对新数据库的需求。 这里很好的例子

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM