基于where子句从十亿行表中删除数据

sha*_*dov 5 postgresql delete postgresql-9.2

我需要根据索引日期字段从 13 亿行表中删除大约 4 亿行。

该表的大小约为 800 GB。

在不造成不利影响的情况下删除数据的最有效方法是什么?该表正在大量使用,这意味着大量插入和更新(不会影响要删除的行)。

有一个维护窗口,这将是最快的,但我可能无法获得足够大的维护窗口。另一方面,我可以花时间进行删除,因此不会着急。

sha*_*dov 2

想出了一个更好的方法来做到这一点

  1. Insert into new_tbl select * from old_tbl where start_date < now -INTERVAL '2 years'
  2. 在停机窗口期间:

    insert into new_tbl select * from old_tbl where id not in (select id from new_tbl ) and id not in ( select id from old_tbl)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 重命名old_tblold_tbl_dropnew_tblold_tbl.

  4. 降低old_tbl_drop