繁体   English   中英

为什么这个查询运行得更快? (独特与不存在)

[英]Why does this query run faster? (UNIQUE vs NOT EXISTS)

我正在尝试运行一个简单的操作,其中我有一个名为 insert_base 的表和另一个名为 insert_values 的表(均具有属性 a、b),我只想将 insert_values 中的所有值复制到 insert_base 中,同时避免重复- 也就是说,我不想在 insert_values 中插入一个已经存在的元组,也不想在 insert_values 中插入同一个元组两次。 我目前正在寻找两种查询方法来执行此操作:

INSERT INTO insert_base SELECT DISTINCT * FROM insert_values IV
WHERE NOT EXISTS
(SELECT * FROM insert_base IB WHERE IV.a = IB.a AND IV.b = IB.b);

另一个涉及在 insert_base(a,b) 上使用 UNIQUE 约束:

INSERT INTO insert_base SELECT * FROM insert_values ON CONFLICT DO NOTHING;

但是,每次我运行这个时,第一个查询运行得明显更快(500 毫秒比 1 秒 + 300 毫秒),我不确定为什么会这样? 这两个查询不做大致相同的事情吗? 我知道 UNIQUE 约束只是在 (a,b) 上放置一个索引,但这不会使它比第一种方法更快吗? 事实上,当我在 (a,b) 上运行带有索引的第一个方法时,它实际上运行得比没有任何索引(或唯一约束)的情况稍微慢一些,这让我更加困惑。

任何帮助将非常感激。 顺便说一下,我在 postgresql 中运行所有这些。

您的第二个查询比第一个查询做更多的工作。 它尝试插入insert_values表中的每一行,然后当它有时遇到冲突时它会放弃插入。

您的第一个查询的 WHERE 子句在尝试插入之前过滤掉无法插入的行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM