【问题标题】:Incremental delete - How it is beneficial?增量删除 - 它有什么好处?
【发布时间】:2010-10-08 18:19:03
【问题描述】:

如果我有一个包含大量数据的表......如果我执行增量删除而不是“一次性删除”......有什么好处?

一次性删除

 DELETE table_1
     WHERE BID = @BID
    AND CN = @CN        
     AND PD = @PD;  

增量删除

While (1=1)
Begin
 DELETE TOP (100000) FROM table_1
     WHERE BID = @BID
    AND CN = @CN        
     AND PD = @PD;  

If @@rowcount = 0   -- No row affected.
  BREAK
 ELSE
  Continue
End

我得到了帮助 Deleting data in a sql server table takes much time

【问题讨论】:

  • 一次交易中的 4 亿条记录会炸毁您的日志,如果要这样做,请确保您有足够的空间。
  • 我不会一次删除 4 亿个...我有一个包含 4 亿个数据的表...我将一次删除可能 150 万个数据...并在其中插入一些数据。

标签: sql-server performance sql-delete


【解决方案1】:

取决于配置,我看到大量删除会炸毁事务日志并导致磁盘空间不足导致故障。

您还可以通过使用较小的批次来避免锁定升级。

【讨论】:

  • 只是补充一点,一旦持有 5,000 个锁,就会尝试锁升级,因此即使在增量版本中也需要大幅减少批量大小才能获得此好处。
  • 减少批量大小 -> 您的意思是在下面的查询中将值从“100000”更改为“100”? DELETE TOP (100000) FROM table_1 WHERE BID = @BID AND CN = @CN AND PD = @PD;
  • @Anish - 5,000 假设删除需要行锁。如果您不必担心并发访问,这并不重要。
  • @Anish,锁升级是当 SQL 服务器优化器通过条件时,它将锁定表而不是行。升级有很多级别,但这是一般的想法。
【解决方案2】:

区别在于回滚信息的大小。

SQL Server 是事务性的,在提交删除之前应该可以回滚事务。

举个例子:

  • 10 GB 硬盘可用空间
  • 要删除的信息 20 GB

当您开始删除时,事务日志会增长,直到磁盘已满然后它会崩溃。

即使有足够的磁盘空间,也存在其他问题,例如数据库锁定或性能下降。如果从实时系统中删除数据,这可能是一个严重的问题。

【讨论】:

  • 好的...这意味着..增量删除肯定会减少时间(删除数据)
  • @Anish,更重要的是它有更好的工作机会,我们最近不得不从实时数据库中删除 150,000,000 行,我们一次删除了 500,000 行。一次性删除所有内容会导致系统崩溃。
【解决方案3】:

或者,您可以导出要保留的数据、截断表格并重新加载数据。这可能会更快。即使您想保留 50% 的数据,它仍然可以更快 - 截断只记录最低限度。运行您自己的基准测试

【讨论】:

  • 我需要保留的数据比我希望删除的数据要多。所以我觉得这种做法不好……不是吗?
  • 它仍然可以更快 - 截断只是最低限度地记录。运行您自己的基准测试。
  • 注意:如果表涉及复制或日志传送,并且如果外键引用要截断的表,则无法截断该表。
【解决方案4】:

我是DB调优的菜鸟.....:(

我也是……
但我不需要了解复杂的技术(如锁升级等)来感受/猜测小块吃/咬西瓜的好处,而不是把它整块放进嘴里

【讨论】:

  • 我在看...为什么/如何有益...我从一些人那里得到了答案,这是因为 sql server 保留的日志...。在吃西瓜的时候..我没有记录它的习惯,因为我从不回滚它。
猜你喜欢
  • 2013-09-16
  • 2014-07-07
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-05
相关资源
最近更新 更多