【问题标题】:Delete 130 million rows删除 1.3 亿行
【发布时间】:2019-03-21 15:57:57
【问题描述】:

在 SQL Server 2012 中,我需要从具有 4-5 个索引的表中删除 100+ 百万行。

我该如何继续?估计是事务日志满了,所以取消事务。

感谢您的帮助

【问题讨论】:

  • 基于什么标准?
  • 您是删除了超过 50% 的行,还是少于 50% 的行。 (每种策略不同)。
  • @tgolisch 80% 已删除
  • 戈登比我快。如果要删除一半以上,通常最好将数据(要保留的)复制到新表(不带索引),然后在移动数据后应用索引。删除旧的,重命名新的。

标签: sql sql-server


【解决方案1】:

根据表格的大小,您可能会发现清空和重新填充会更快:

create table temp_t
    select *
    from t
    where <i want to keep conditions>;

truncate table t;

insert into t
    select *
    from temp_t;

从长远来看,您可能希望添加分区以便更轻松地删除行。例如,按日期分区可以让您以最少的开销删除旧记录。

【讨论】:

  • 它已经按日期分区。我需要删除超过 3 个月的每个日期,而不是月末。我已经有一个有效日期的视图,所以我确实删除了不在有效日期的地方,但又有太多要删除的地方
  • 如果您不能使用此方法,您可以阅读 Aaron Bertrand 的这篇关于批量删除的帖子并查看他的测试结果。 sqlperformance.com/2013/03/io-subsystem/chunk-deletes
【解决方案2】:

如果你

进行块删除就足够了。在 SO 和 dba.SE 上的各种相关问题中可以找到很多示例(例如 this one 或 that one)。为了使这个答案自成一体,我将在此处引用其中一个示例(取自 this answer by gbn 并稍作修改):

SELECT 'Starting' --sets @@ROWCOUNT
WHILE @@ROWCOUNT <> 0
    DELETE TOP (10000) MyTable WHERE <some condition>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 2022-11-15
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多