文档中心MogDBMogDB StackUqbar
v5.0

文档:v5.0

支持的版本:

其他版本:

聚合函数distinct性能优化

可获得性

本特性自MogDB 5.0.0版本开始引入。

agg:Aggregate Functions (聚合函数)

特性简介

在实际生产生活中,经常在聚合函数中使用distinct语句对数据先去重然后进行聚集运算,本特性对distinct语句执行性能进行优化。

客户价值

提升聚合函数中distinct查询语句的执行性能,实测场景中性能提升可达3倍以上。

特性描述

对于distinct的实现,在进行聚集计算前,将扫描上来的数据先缓存起来,通过distinct列进行排序,然后只取每个分组的第一行数据进行聚集运算,从而实现数据先过滤后聚集的过程。

上述实现中数据的去重操作采用了排序的方法,而排序操作本身对性能影响很大,如果输出没有排序的要求,单纯进行数据的去重,HashAgg可以快速实现数据去重,并且执行性能要远远优于排序操作,基于此,本特性通过双层agg算子实现distinct操作,底层通过HashAgg先对数据进行去重,上层agg算子再对去重后的数据进行聚集,从而提升执行性能。

特性约束

  • distinct并发场景下,性能已做优化,本次性能优化只针对非并发场景。
  • 不支持distinct为多列的场景。

示例

MogDB=# CREATE TABLE tb_distinct(a INT, b INT, c INT, d INT, e INT);
CREATE TABLE
MogDB=# EXPLAIN VERBOSE SELECT a, COUNT(DISTINCT b) FROM tb_distinct GROUP BY a;
                                    QUERY PLAN
----------------------------------------------------------------------------------
 HashAggregate  (cost=41.59..43.59 rows=200 width=24)
   Output: a, count(b)
   Group By Key: tb_distinct.a
   ->  HashAggregate  (cost=38.59..40.59 rows=200 width=16)
         Output: a, b
         Group By Key: tb_distinct.a, tb_distinct.b
         ->  Seq Scan on public.tb_distinct  (cost=0.00..26.34 rows=1634 width=8)
               Output: a, b
(8 rows)
Copyright © 2011-2024 www.enmotech.com All rights reserved.