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

Tis*_*sha 3 postgresql

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

insert into abc select * from def dd where not exists (select 1 from abc aa where aa.id = dd.id);
Run Code Online (Sandbox Code Playgroud)

VS

insert into abc select * from def dd on conflict(id) do nothing;
Run Code Online (Sandbox Code Playgroud)

哪一个更快?

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

Gor*_*off 5

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

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

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