sql - SQL 反连接删除优化
问题描述
我在 postgres 数据库中有两个表,posts
并且users
. posts
有一个user_id
引用users.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;
与更新表中的大多数行相比,批量插入的工作量要少得多。当然,您应该仔细测试。截断表是从中删除所有行的快速方法。
推荐阅读
- node.js - 在 nodejs 中解析 CSV 并获取在“结束”闭包之外可访问的内容数组?
- c# - 从名称中包含中间字符的组合框中获取项目名称
- blockchain - opensea 如何处理买卖交易
- python-3.x - 使用 Matplotlib 仅显示 x 和 y 轴标签的最小值和最大值
- casting - 如何识别函数参数的数据类型
- java - 使用javafx按下键时从文本区域的特定行编辑文本?
- python - 烧瓶新手查询 sqlite3.OperationalError
- c# - 具有多个 dbcontext 和不同连接字符串的 GraphQL 查询
- python - 验证数据不正确
- javascript - 使用动态数据从数组创建子数组