PostgreSQL是否会短路其BOOL_OR()评估?

PostgreSQL是否会短路其BOOL_OR()评估?,第1张

概述EXISTS比COUNT(*)快,因为它可以短路 很多时候,我喜欢检查SQL中存在的东西.例如,我这样做: -- PostgreSQL syntax, SQL standard syntax:SELECT EXISTS (SELECT .. FROM some_table WHERE some_boolean_expression)-- Oracle syntaxSELECT CASE EXISTS比COUNT(*)快,因为它可以短路

很多时候,我喜欢检查sql中存在的东西.例如,我这样做:

-- Postgresql Syntax,sql standard Syntax:SELECT EXISTS (SELECT .. FROM some_table WHERE some_boolean_Expression)-- Oracle SyntaxSELECT CASE   WHEN EXISTS (SELECT .. FROM some_table WHERE some_boolean_Expression) THEN 1   ELSE 0 ENDFROM dual

在大多数数据库中,EXISTS是“短路的”,即一旦找到一行,数据库就可以停止在表中查找行. This is usually much faster than comparing COUNT(*) >= 1 as can be seen in this blog post.

使用带有GROUP BY的EXISTS

有时,我想在GROUP BY查询中为每个组执行此 *** 作,即我想“聚合”存在值.没有EXISTS聚合函数,但Postgresql幸运地支持BOOL_OR()聚合函数,就像在这个语句中一样:

SELECT something,bool_or (some_boolean_Expression)FROM some_tableGROUP BY something

The documentation mentions something about COUNT(*) being slow因为计算计数需要明显的顺序扫描.但不幸的是,它没有说明BOol_OR()被短路了.是这样的吗?一旦遇到第一个TRUE值,BOol_OR()是否会停止聚合新值?

解决方法 如果你想检查是否存在,我通常使用liMIT / FETCH FirsT 1 ROW ONLY查询:

SELECT .. FROM some_table WHERE some_boolean_ExpressionFETCH 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子句.它每个组只执行一次,并在找到第一个命中后立即中止.但是,当然,这表现得更好还是更差取决于您的搜索谓词和索引.

总结

以上是内存溢出为你收集整理的PostgreSQL是否会短路其BOOL_OR()评估?全部内容,希望文章能够帮你解决PostgreSQL是否会短路其BOOL_OR()评估?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1162651.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存