2

我有一个非常大的表 [X],它有 1.7 亿行,我们需要归档数据以仅保留 [X] 中使用的记录。我们这样做是为了让我们的系统在减速时保持快速。我们只使用整个表中的少量行(说不到 10%),因此我们可以将大量数据归档到例如 Archive.[X] 中。

问题是当我们尝试删除记录时,会花费很多时间。现在我们已经运行了以下检查以进行故障排除,以查看为什么需要这么长时间的任何可能性 1) 表已编入索引 2) 没有未索引的外键 3) 删除时没有触发器在后台执行额外工作

大家有没有遇到过类似的情况?做类似事情时最好遵循的程序是什么?有没有可以提供帮助的工具?

我感谢您的帮助!

4

2 回答 2

4

选项

  • 为什么不把 10% 放到一个新表中呢?
  • 批量删除/插入不在事务中(见下文)
  • 分区表(又名让引擎处理它)

填充存档表

SELECT 'starting' -- sets @@ROWCOUNT
WHILE @@ROWCOUNT <> 0
BEGIN
    DELETE TOP (50000) dbo.Mytable
    OUTPUT DELETED.* INTO ArchiveTable 
    WHERE SomeCol < <Afilter>

    -- maybe CHECKPOINT

    WAIT FOR DELAY ...
END
于 2011-10-04T10:56:39.113 回答
2

你应该去分区你的数据库/表。

于 2011-10-04T10:52:34.843 回答