HashAggregate

名称

哈希聚集算子

介绍

在表比较大的情况下,排序的代价时比较高的因此常常会选用哈希聚集作为含有GROUP BY语句的聚集方式。

与朴素聚集不同,哈希聚集会在算子中建立一张哈希表,对数据进行逐行扫描,先计算元组的哈希值并探测哈希表,如果发现记录不存在,则在哈希表中插入一条新记录。

反之,则基于元组和哈希表中的记录进行累计计算并在哈希表上进行更新,最后直接遍历哈希表进行处理,逐行输出最后的聚集结果。

举例

--清理环境
DROP TABLE t1 CASCADE;

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

EXPLAIN ANALYZE SELECT DISTINCT a FROM t1;
                                            QUERY PLAN
--------------------------------------------------------------------------------------------------
 HashAggregate  (cost=7.13..7.13 rows=10 width=4) (actual time=0.08..0.09 rows=10 loops=1)
   Group Key: A
 Batches: 1  Memory Usage: 32 kB
   ->  Seq Scan on T1  (cost=0.00..7.10 rows=10 width=4) (actual time=0.03..0.04 rows=10 loops=1)
 Planning Time: 0.18 msec
 Execution Time: 0.28 msec
(6 rows)