一位朋友写了一个查询,其中包含以下条件:
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之间(我们在重新启动服务器后进行了测试)。从概念上讲,我缺少什么?
答案 0 :(得分:4)
我的猜测是第一个可以短路;只要它看到符合条件的任何行,它就可以返回1的计数。第二行需要检查每一行(并且每个结果都返回一行“1”),所以不能获得速度短路的好处。
话虽这么说,做一个EXPLAIN(或者你的数据库支持的任何东西)可能会提供比我的猜测更好的洞察力。
答案 1 :(得分:1)
从概念上讲,我会说你的选择至少和另一个一样好,至少要优雅一点。我不确定它是否应该更慢或更快 - 如果那些25毫秒是相关的。 通常,通过查看EXPLAIN输出来确定答案。
Postgresql版本是什么?据说PG 8.4对NOT EXISTS
有一些优化