为什么一个查询始终比postgres中的另一个查询快〜25ms?

时间:2010-05-06 17:46:54

标签: postgresql

一位朋友写了一个查询,其中包含以下条件:

    AND ( SELECT count(1) FROM users_alerts_status uas 
         WHERE uas.alert_id = context_alert.alert_id 
         AND   uas.user_id = 18309 
         AND   uas.status = 'read' ) = 0

看到这个,我建议我们将其改为:

    AND NOT EXISTS ( SELECT 1 FROM users_alerts_status uas 
           WHERE uas.alert_id = context_alert.alert_id 
           AND   uas.user_id = 18309 
           AND   uas.status = 'read' )

但是在测试中,查询的第一个版本一直在20到30ms之间(我们在重新启动服务器后进行了测试)。从概念上讲,我缺少什么?

2 个答案:

答案 0 :(得分:4)

我的猜测是第一个可以短路;只要它看到符合条件的任何行,它就可以返回1的计数。第二行需要检查每一行(并且每个结果都返回一行“1”),所以不能获得速度短路的好处。

话虽这么说,做一个EXPLAIN(或者你的数据库支持的任何东西)可能会提供比我的猜测更好的洞察力。

答案 1 :(得分:1)

从概念上讲,我会说你的选择至少和另一个一样好,至少要优雅一点。我不确定它是否应该更慢或更快 - 如果那些25毫秒是相关的。 通常,通过查看EXPLAIN输出来确定答案。

Postgresql版本是什么?据说PG 8.4对NOT EXISTS

有一些优化