我有一张相当大的桌子,大约有3000万行。由于先前的删除不适当级联的错误,许多项目不再被引用。
尝试做一个简单的DELETE WHERE ID_DOES_NOT_EXIST_IN_OTHER_TABLE正在进行,整个周末都没有完成,但我不得不最终杀死它。但是,这里没有紧迫感,所以我想找到一种方法来增量。 Postgres DELETE似乎不允许使用限制。
一种方法是一次删除100000(选择一个任意数字)的行,这样我就可以慢慢地在桌子上工作并清理它了?
答案 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);