我有一个非常大的表 [X],它有 1.7 亿行,我们需要归档数据以仅保留 [X] 中使用过的记录。我们这样做是为了让我们的系统在速度变慢时保持快速。我们只使用整个表中的少量行(不到 10%),因此我们可以负担得起将大量数据归档到例如 Archive.[X]。
问题是当我们尝试删除记录时,会花费很多时间。现在我们已经运行了以下检查以进行故障排除,以了解为什么需要这么长时间的任何可能性 1)表被索引 2) 没有未索引的外键 3) 删除时没有触发器在后台做额外的工作
你们有遇到过类似的情况吗?做类似事情时应遵循的最佳程序是什么?有什么工具可以提供帮助吗?
感谢您的帮助!
最佳答案
选项
- 为什么不将这 10% 放入新表中?
- 在事务中批量删除/插入not(见下文)
- 分区表(也就是让引擎处理它)
填充归档表
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
关于sql - 微软 SQL : The best way to delete rows from a ginormous table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7646715/