PostgreSQL是否会短路其BOOL_OR()评估?
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 使用带有GROUP BY的EXISTS 有时,我想在GROUP BY查询中为每个组执行此操作,即我想“聚合”存在值.没有EXISTS聚合函数,但PostgreSQL幸运地支持 SELECT something,bool_or (some_boolean_expression) FROM some_table GROUP BY something The documentation mentions something about 解决方法
如果你想检查是否存在,我通常使用LIMIT / FETCH FIRST 1 ROW ONLY查询:
SELECT .. FROM some_table WHERE some_boolean_expression FETCH FIRST 1 ROW ONLY 这通常会在第一次点击后停止执行. 对于来自另一个表的每一行(组),可以使用LATERAL应用相同的技术. SELECT * FROM (SELECT something FROM some_table GROUP BY something ) t1 LEFT JOIN LATERAL (SELECT ... FROM ... WHERE ... FETCH FIRST 1 ROW ONLY) t2 ON (true) 在t2中,您可以使用与该组的任何行匹配的WHERE子句.它每个组只执行一次,并在找到第一个命中后立即中止.但是,当然,这表现得更好还是更差取决于您的搜索谓词和索引. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |