加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 16:08:17 所属栏目:百科 来源:网络整理
导读:EXISTS比COUNT(*)快,因为它可以短路 很多时候,我喜欢检查SQL中存在的东西.例如,我这样做: -- PostgreSQL syntax,SQL standard syntax:SELECT EXISTS (SELECT .. FROM some_table WHERE some_boolean_expression)-- Oracle syntaxSELECT CASE WHEN EXISTS (S
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.

使用带有GROUP BY的EXISTS

有时,我想在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()被短路了.是这样的吗?一旦遇到第一个TRUE值,BOOL_OR()是否会停止聚合新值?

解决方法

如果你想检查是否存在,我通常使用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子句.它每个组只执行一次,并在找到第一个命中后立即中止.但是,当然,这表现得更好还是更差取决于您的搜索谓词和索引.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读