Postgres:以块的形式删除巨型表中的未引用条目

时间:2017-11-20 16:18:22

标签: postgresql

我有一张相当大的桌子,大约有3000万行。由于先前的删除不适当级联的错误,许多项目不再被引用。

尝试做一个简单的DELETE WHERE ID_DOES_NOT_EXIST_IN_OTHER_TABLE正在进行,整个周末都没有完成,但我不得不最终杀死它。但是,这里没有紧迫感,所以我想找到一种方法来增量。 Postgres DELETE似乎不允许使用限制。

一种方法是一次删除100000(选择一个任意数字)的行,这样我就可以慢慢地在桌子上工作并清理它了?

1 个答案:

答案 0 :(得分:1)

希望你有好的索引,希望这会有所帮助。尝试使用CTE标记ID的子集以进行删除:

      WITH marked_ids as (
    SELECT my_table.id
      FROM other_table
     RIGHT
     OUTER
      JOIN my_table
    ON other_table.id = my_table.fk_id
     WHERE other_table.id IS NULL
     LIMIT 1000
)
DELETE 
  FROM my_table
 WHERE id IN (SELECT id FROM marked_ids);