postgresql – 从postgres批量删除行的最有效方法

前端之家收集整理的这篇文章主要介绍了postgresql – 从postgres批量删除行的最有效方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想知道从Postgresql删除大量行的最有效方法是什么,这个过程每天都会重复导入数据(插入删除的增量)到表中.可能有数千个,可能有数百万行要删除.

我有一个主键文件,每行一个.我想到的两个选项是沿着下面的方向,但我不知道/理解Postgresql的内部结构,以做出最明智的决定.

>对文件中的每一行执行DELETE查询,在主键上使用简单的WHERE(或使用IN()子句对n个批次中的删除进行分组)
>使用COPY命令将主键导入临时表,然后使用连接从主表中删除

任何建议将不胜感激!

你的第二个选择是更清洁,并且表现良好,足以让它值得.您的另一种选择是构建巨大的查询,这对计划和执行来说非常痛苦.一般来说,让Postgresql在这里工作会更好.一般来说,我已经按照你描述的方式找到了数万行的更新,以便充分发挥作用,但有一件重要的事情要避免这样做.

这样做的方法是在删除中使用select和join.

DELETE 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通常很擅长避免糟糕的计划,但仍然存在涉及外部联接的情况,这可能会使好的和坏的计划产生很大的差异.

这是在更远的地方徘徊,但我认为值得一提,因为从IN到NOT IN并观察查询性能坦克是多么容易.

原文链接:/postgresql/192405.html

猜你在找的Postgre SQL相关文章