【问题标题】:Delete data from table efficiently有效地从表中删除数据
【发布时间】:2018-08-29 16:52:43
【问题描述】:

我们正在使用需要删除日志表的工具。现在,我们保留 100 万行并删除其余行(如果有)。这很耗时,有时在生产中需要 12 小时才能删除数据,影响日常事务。有没有其他方法可以有效删除日志表,不影响日常事务。

假设我们想要保留 100 万行:

Select query:

Select Query:select min(date) from (select date from table order by date desc) where rownum <= 1000000

Delete Query:

Delete Query:Delete from table where date > (result of select query)

有什么办法可以优化这两个查询吗?

【问题讨论】:

  • 您实际使用的是哪个 DBMS?细节会有所不同,但您是否尝试过批量删除而不是整套删除?
  • SQL Server 还是 Oracle?你们都标记了。
  • 它适用于 mssql 和 oracle
  • 我没试过批量删除,有用吗?
  • 是的,批量删除是有益的,有时甚至需要(否则会因数据库本身的日志记录问题而超时)

标签: sql sql-server database oracle oracle11g


【解决方案1】:

插入较小的表比从较大的表中删除要快得多。在这种情况下,您可以将要保留的记录插入到临时表中。 如果不考虑日志记录并且参照完整性将允许它,您可以简单地:

  1. 创建一个与日志表完全相同的临时表。
  2. 将您打算从日志表中保留的记录插入到临时表中。
  3. 删除您的日志表。
  4. 将暂存表重命名为日志。

【讨论】:

  • 当前记录将存储在哪里?
  • @mahan07 - 源表是要删除数百万行的日志表。如果允许,只需将您不想删除的行插入单独的物理表中。它会快得多。
  • 这真的是一种选择吗?如果他们每天有那么多记录,他们会不断地插入其中。我无法想象这个过程不会导致阻塞/错误
  • @UnhandledExcepSean - 我不想每天都这样做,而且我没有看到据说是日常过程。有人提到,完成后它会影响每日交易(删除和重命名表是一个仅需几秒钟的元更改)。除了基于分区的方案之外,这将是最快的方法,但是,如果要每天执行此操作是正确的,那么它可能并不理想。
  • @RossBush-我们每秒钟都有一个事务。当我删除日志表时,我可以在哪里保留所有这些日志?这个过程将有停机时间。
【解决方案2】:

您想一次删除一万行。

delete top (10000) from tableA where condition1 <> xyz
while (@@rowcount >0)
begin
     delete top (10000) from tableA where condition1 <> xyz

end
delete from tablea where condition1 <> xyz

这样你就不会有一个大的事务日志。您可能想尝试行数(有些人使用 1000 行),但这很大程度上取决于您机器中的活动量、驱动器的速度以及日志文件的位置和配置。你说你想保留某些行,所以我添加了 condition1 xyz

【讨论】:

    猜你喜欢
    • 2019-11-05
    • 2021-06-18
    • 1970-01-01
    • 2020-04-21
    • 2021-11-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多