postgres 9.5+冲突(主键)比不存在更快吗?

时间:2016-11-15 11:47:45

标签: postgresql

我们假设您有任何插入查询,如下所示 -

insert into abc select * from def dd where not exists (select 1 from abc aa where aa.id = dd.id);

Vs的

insert into abc select * from def dd on conflict(id) do nothing;

哪一个更快?

两个表都非常大,如果与主键冲突,则不插入

2 个答案:

答案 0 :(得分:5)

哪个更快并不是真正相关的。实际上,两者都应该是非常可比的,因为两者都将使用唯一索引来查找值。

更重要的是NOT EXISTS在语义上不正确。竞争条件可能导致两个查询都失败NOT EXISTS。 。 。然后两者都会尝试插入相同的值。

因此,为了安全起见,我强烈建议使用ON CONFLICT表述。它确保数据库确保数据的一致性。

答案 1 :(得分:1)

哪个更快,往往取决于细节。通常不可能做出全面回答。虽然它们略有不同,但它们足够接近,在特定情况下它们可能是替代品。

第一个是反连接,而第二个是简单的选择,指示继续冲突。这意味着规划人员可能能够使用信息更快地有效地运行它。所以一般来说,NOT EXISTS应该表现得更好。

但事实并非如此。如果这两个表足够大,您可能会有更昂贵的连接策略,这可能是个问题。