SQL反加入删除优化

标签 sql postgresql anti-join

我在 postgres 数据库中有两个表,postsusersposts 有一个 user_id 外键引用 users.id 主键列。两张 table 都很大。

我刚刚删除了一组随机用户(约占总用户的 80%),我想删除所有引用已删除用户的帖子,有效地反加入和删除。最有效的方法是什么?

目前我有这个:

DELETE FROM posts l
WHERE NOT EXISTS
  (
     SELECT NULL
     FROM users r
     WHERE r.id = l.user_id
  )

有没有更有效的方法?

最佳答案

如果要删除80%的用户,那么最快的方法大概是:

create table temp_posts as 
    select p.*
    from posts p
    where exists (select 1 from users u where u.id = p.user_id);

truncate table posts;

insert into posts
    select *
    from temp_posts;

批量插入比更新表中的大部分行要少得多。当然,您应该仔细测试一下。截断表格是从表格中删除所有行的快速方法。

关于SQL反加入删除优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53194293/

相关文章:

sql - 检索最大/最小记录

mysql - 如何将mysql数据库同步到外部数据源

sql-server - 当连接依赖于第三个表中的数据时如何在 MSSQL 中反连接

sql - 在计算之前过滤 Postgres percent_rank 但显示所有结果?

sql - 具有非标准编号的父子关系的枚举表

sql - Timescale run_job() 找不到定义的函数/过程

postgresql - 简单的 postgres 函数

postgresql - Anorm 返回 0 个结果,而 psql 返回 2 个结果

database - Postgres ANTI-JOIN 需要表扫描?

mysql - 如何通过 JOIN 从另一个表中查找不存在的数据?