sql - 微软 SQL : The best way to delete rows from a ginormous table

标签 sql sql-server-2008 database-optimization

我有一个非常大的表 [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/

相关文章:

SQL Server 在定义的时间之前获取记录

sql - 如何为数据库中的每个选定行执行插入

mysql优化

javascript - 在另一个页面中反射(reflect)从数据库中存储的单选切换按钮选择

sql - Varchar 上的索引?

mysql - SQL 插入选择依赖于其他表

java - 插入从选择查询中检索的 MySQL 结果集?

MySQL 使用 cron 作业创建表或使用 View

sql - 错误 360 : Cannot modify table or view used in subquery

python - 我怎样才能解决以下结果?