【发布时间】:2017-02-03 08:56:48
【问题描述】:
EXISTS 比 COUNT(*) 快,因为它可以短路
很多时候,我喜欢在 SQL 中检查事物是否存在。例如,我这样做:
-- PostgreSQL syntax, SQL standard syntax:
SELECT EXISTS (SELECT .. FROM some_table WHERE some_boolean_expression)
-- Oracle syntax
SELECT CASE
WHEN EXISTS (SELECT .. FROM some_table WHERE some_boolean_expression) THEN 1
ELSE 0
END
FROM dual
在大多数数据库中,EXISTS 是“短路的”,即数据库可以在找到一行后立即停止在表中查找行。 This is usually much faster than comparing COUNT(*) >= 1 as can be seen in this blog post.
使用EXISTS 和GROUP BY
有时,我想在GROUP BY 查询中为每个组执行此操作,即我想“聚合”存在值。没有 EXISTS 聚合函数,但 PostgreSQL 幸运地支持 BOOL_OR() 聚合函数,就像下面的语句:
SELECT something, bool_or (some_boolean_expression)
FROM some_table
GROUP BY something
The documentation mentions something about COUNT(*) being slow 因为计算计数需要明显的顺序扫描。但不幸的是,它没有说明BOOL_OR() 被短路。是这样吗? BOOL_OR() 在遇到第一个 TRUE 值时是否停止聚合新值?
【问题讨论】:
-
执行计划说了什么?但我希望
group by的存在需要从表中读取所有内容,否则无法正确分组数据 -
@a_horse_with_no_name:例如
"Aggregate (cost=1.06..1.07 rows=1 width=4)"。 IE。不是很多。这与我放置COUNT()聚合函数时的操作相同。或任意数量的聚合函数。不过,我没想到计划会显示这些细节。 -
@LukasEder :你找到标题问题的答案了吗?
-
@MarkKCowan:不。如果我有的话,我会在这里提供答案......
标签: sql postgresql exists boolean-logic boolean-expression