GroupAggregate

名称

分组聚集算子

介绍

朴素聚集方式只适合无GROUP BY的查询语句,对于含有GROUP BY的语句来说,可采用分组聚集操作对数据进行聚集。

分组聚集是一种基于排序的实现方式,思路上与朴素聚集很接近唯一不同的是分组聚集会先对元组进行排序(通常以 Sort 算子作为下层节点)

排序后,所有的键值相同的元素会排列到一起,只需要扫描一遍并进行累计计算即可,在扫描到与上个元素不同的键时会产生截断。

举例

--清理环境
DROP TABLE t1 CASCADE;

--创建环境
CREATE TABLE t1(a int);
INSERT INTO t1 SELECT generate_series(1,10);
ANALYZE t1;

EXPLAIN ANALYZE SELECT SUM(a) FROM t1 GROUP BY a ORDER BY a;
                                               QUERY PLAN
--------------------------------------------------------------------------------------------------------
 GroupAggregate  (cost=7.27..7.37 rows=10 width=4) (actual time=0.83..0.84 rows=10 loops=1)
   Group Key: A
   ->  Sort  (cost=7.27..7.29 rows=10 width=4) (actual time=0.61..0.61 rows=10 loops=1)
         Sort Key: A
         Sort Method: quicksort  Memory: 2kB
         ->  Seq Scan on T1  (cost=0.00..7.10 rows=10 width=4) (actual time=0.02..0.03 rows=10 loops=1)
 Planning Time: 0.18 msec
 Execution Time: 1.34 msec
(8 rows)