PostgreSQL 中除了 SPJ(SELECT、PROJECT、JOIN) 之外,还有大量的聚合和分组操作,比如下面示例中的语句,其中有聚集操作 avg(a) 和分组操作 GROUP BY b。顾名思义,聚集操作就是一个合并的过程,而分组操作则是对数据的归类。
postgres=# EXPLAIN SELECT avg(a) FROM TEST_A GROUP BY b;
QUERY PLAN
--------------------------------------------------------------
HashAggregate (cost=2.50..3.75 rows=100 width=36)
Group Key: b
-> Seq Scan on test_a (cost=0.00..2.00 rows=100 width=8)
(3 rows)
简单的聚集操作
简单来说,聚集操作分成 3 个步骤。
- 初始阶段:初始化一个初值,比如对于 avg 操作来说,它的初值是 0。
- 中间阶段:向初值中不断累加值,并记载累加了多少条记录。比如要对 TEST_A.a 做 avg 聚集操作,就需要先把 TEST_A.a 中的所有列值累加起来,并且同时统计 TEST_A.a 中有多少条数据。
- 结束阶段:对累加的数据做最后的处理,比如对 avg 聚集来说,在中间阶段已经累加了所有的值和数量,求平均值就只需要做一次除法就可以了。
这样看起来还是蛮容易的,如果我们自己去算一
本文详细介绍了 PostgreSQL 中的聚集与分组操作,包括简单的聚集操作、复杂的聚集操作和分组操作。文章阐述了聚集操作的三个阶段,以及 PostgreSQL 如何通过并行处理和额外的函数来优化聚集性能。此外,还讨论了分组操作的实现,如通过排序和哈希方法。最后,提到了窗口函数中的特殊聚集操作和用户可能通过禁用哈希方法获得的性能提升。
订阅专栏 解锁全文
6956

被折叠的 条评论
为什么被折叠?



