首页 > 解决方案 > 有效地从一个 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

但是上面的命令返回了一个语法错误。可以修改它以避免错误吗?

标签: sqlpostgresqlindexingsql-deletepostgresql-performance

解决方案


句法

您的第二次尝试在 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或更复杂的查询技术将是有序的......


推荐阅读