我想知道从Postgresql中删除大量行的最有效方法是什么,这个过程每天都会重复导入数据(插入删除的增量)到表中.可能有数千个,可能有数百万行要删除.
我有一个主键文件,每行一个.我想到的两个选项是沿着下面的方向,但我不知道/理解Postgresql的内部结构,以做出最明智的决定.
>对文件中的每一行执行DELETE查询,在主键上使用简单的WHERE(或使用IN()子句对n个批次中的删除进行分组)
>使用COPY命令将主键导入临时表,然后使用连接从主表中删除
任何建议将不胜感激!
你的第二个选择是更清洁,并且表现良好,足以让它值得.您的另一种选择是构建巨大的查询,这对计划和执行来说非常痛苦.一般来说,让Postgresql在这里工作会更好.一般来说,我已经按照你描述的方式找到了数万行的更新,以便充分发挥作用,但有一件重要的事情要避免这样做.
原文链接:/postgresql/192405.htmlDELETE FROM foo WHERE id IN (select id from rows_to_delete);
在任何情况下,您都不应该使用大表:
DELETE FROM foo WHERE id NOT IN (select id from rows_to_keep);
这通常会导致嵌套循环反连接,这将使性能相当成问题.如果你最终不得不走这条路,那就改为:
DELETE FROM foo WHERE id IN (select id from foo f LEFT JOIN rows_to_keep d on f.id = d.id WHERE d.id IS NULL);
Postgresql通常很擅长避免糟糕的计划,但仍然存在涉及外部联接的情况,这可能会使好的和坏的计划产生很大的差异.