加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 16:23:13 所属栏目:百科 来源:网络整理
导读:我想知道从PostgreSQL中删除大量行的最有效方法是什么,这个过程每天都会重复导入数据(插入删除的增量)到表中.可能有数千个,可能有数百万行要删除. 我有一个主键文件,每行一个.我想到的两个选项是沿着下面的方向,但我不知道/理解PostgreSQL的内部结构,以做出
我想知道从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并观察查询性能坦克是多么容易.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读