有效地从表中删除数据

时间:2018-03-20 18:22:24

标签: sql sql-server database oracle oracle11g

我们正在使用一个工具,我们需要删除日志表。现在,我们要保留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)

我们有什么方法可以优化这两个查询吗?

2 个答案:

答案 0 :(得分:3)

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

  1. 创建一个临时表,它是日志表的精确副本。
  2. 将您要保留的记录从日志表插入到临时表中。
  3. 删除您的日志表。
  4. 将登台表重命名为记录。

答案 1 :(得分:1)

您希望一次删除一万行。

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行)但它非常依赖于计算机中的活动量以及驱动器的速度以及日志文件的放置和配置。你说你想保留某些行,所以我添加了条件1&lt;&gt; XYZ