sql - 有效地从一个 ID 与另一张表匹配的表中删除
问题描述
我在 PostgreSQL 数据库中有两个包含几百万条记录的表。我正在尝试从一个表中删除 ID 与另一表的 ID 匹配的行。我使用了以下命令:
delete from table1 where id in (select id from table2)
上面的命令已经花费了很多时间(几个小时),这让我想知道是否有更快的方法来执行此操作。创建索引会有帮助吗?
我也按照少数人的建议尝试了使用 join 删除:
delete from table1 join table2 on table1.id = table2.id
但是上面的命令返回了一个语法错误。可以修改它以避免错误吗?
解决方案
句法
您的第二次尝试在 PostgreSQL 中是不合法DELETE
的语法。这是:
DELETE FROM table1 t1
USING table2 t2
WHERE t2.id = t1.id;
考虑命令的“注释”DELETE
一章:
PostgreSQL 允许您通过在子句
WHERE
中指定其他表来引用条件中其他表的列。USING
例如,
[...]
这种语法不是标准的。
[...]
在某些情况下,连接样式比子选择样式更容易编写或执行更快。
指数
创建索引会有帮助吗?
索引的有用性总是取决于完整的情况。如果table1
很大,并且比 大得多table2
,则索引table1.id
通常会有所帮助。通常,id
将是 your PRIMARY KEY
,无论如何它都会被隐式索引......
通常,索引 ontable2
也无济于事(即使存在也不会使用。)
但就像我说的:取决于完整的情况,你透露的很少。
设置的其他细节可能会使删除成本高昂。FK 约束、触发器、索引、并发事务持有的锁、表和索引膨胀......
或table2
. (但我会假设ìd
它是唯一的?)然后您将首先从table2
. 根据基数,一个简单DISTINCT
或更复杂的查询技术将是有序的......
推荐阅读
- postgresql - Postgres Checkpointer 进程始终运行
- javascript - 鼠标右键 - 激活输入文件中的粘贴选项
- sql-server - 检索两个字符之间的日期的子字符串
- javascript - Google Chrome 扩展 GetElementById 无需点击即可触发
- php - mysli_fetch_assoc 中的数组减法
- angular - 重写 Angular 8 的引导程序下拉菜单
- javascript - svg.circle 上的 mouseover 和 mouseout 事件
- java - 上传文件时出现 HTTP 错误 400“所需的请求部分‘文件’不存在”
- php - 我如何通过控制器更改 Laravel 6.0 中的 .env 变量?
- javascript - 尽管返回错误语句,JavaScript 仍提交表单