我们假设您有任何插入查询,如下所示 -
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;
哪一个更快?
两个表都非常大,如果与主键冲突,则不插入
答案 0 :(得分:5)
哪个更快并不是真正相关的。实际上,两者都应该是非常可比的,因为两者都将使用唯一索引来查找值。
更重要的是NOT EXISTS
在语义上不正确。竞争条件可能导致两个查询都失败NOT EXISTS
。 。 。然后两者都会尝试插入相同的值。
因此,为了安全起见,我强烈建议使用ON CONFLICT
表述。它确保数据库确保数据的一致性。
答案 1 :(得分:1)
哪个更快,往往取决于细节。通常不可能做出全面回答。虽然它们略有不同,但它们足够接近,在特定情况下它们可能是替代品。
第一个是反连接,而第二个是简单的选择,指示继续冲突。这意味着规划人员可能能够使用信息更快地有效地运行它。所以一般来说,NOT EXISTS应该表现得更好。
但事实并非如此。如果这两个表足够大,您可能会有更昂贵的连接策略,这可能是个问题。