postgreSQL反联接删除优化



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

我刚刚删除了一组随机的用户(约占总用户的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;

与更新表中的大多数行相比,批量插入的工作量要小得多。当然,你应该仔细测试一下。截断表是删除表中所有行的快速方法

有人在这个链接上测试了not exists vs not in vs left join is null。Postgre可以判断出不存在和左联接为null是反联接,因此相应地进行。所以你的方法应该是最有效的。您可能会重组为左联接为null方法,但这可能不会为您带来任何好处。

预防可能会更好。通过级联删除,外键约束是更好的选择。你在对你的问题的评论中提到,这不是一个选项。在您的特定情况下,这不是一个选项吗?因为通常情况下,它是:

REFERENCES someTable(someCol) ON DELETE CASCADE ON UPDATE CASCADE

最新更新