文档中心MogDBMogDB StackUqbar
v5.0

文档:v5.0

支持的版本:

其他版本:

自适应两阶段哈希聚合

可获得性

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

特性简介

自适应两阶段哈希聚合是一种优化技术,用于解决在执行聚合操作时,由于优化器的代价估算不准确,导致选择错误的执行方式从而降低执行效率的问题。

该优化技术通过在运行时收集统计信息来进行动态调整。具体而言,系统会在执行聚合操作时,根据一阶段聚合和两阶段聚合的代价估算,选择其中代价较低的方式进行执行。然后,系统会监测实际执行过程中的资源利用情况和性能指标,并记录下来。

客户价值

在适合自适应两阶段哈希聚合的场景下,开启该功能后,可以明显提升查询性能。根据实际测试数据和用户反馈,具体的性能提升幅度大约在6%至17%之间。这一性能提升的幅度可能会因为具体的查询和数据规模等因素而有所波动,但总体而言,自适应两阶段哈希聚合能够显著改善数据库的查询性能。

因此,对于适合自适应两阶段哈希聚合的查询场景,开启该功能可以获得明显的性能提升,同时也提升了用户的查询体验和系统的整体效率。

特性描述

在自适应两阶段哈希聚合开启的情况下,优化器会默认选择两阶段的哈希聚合进行聚合查询。

具体实现中,下推的聚合算子会统计每组聚合的行数。当哈希表的大小达到一定数量后,如果发现当前数据的大部分组的聚合行数都比较少,系统会将这批数据从哈希表中删除并上传到上层算子。连续出现多次后,后续的数据只会以一个较小的概率进入哈希表做聚合操作,而其他未进入哈希表的数据会直接传给上层算子,相当于只执行一阶段聚合。

通过这样的动态调整,自适应两阶段哈希聚合可以根据实际数据的分布和聚合需求,自主决策是否执行两阶段聚合,从而避免不必要的资源开销,提高查询性能。

特性约束

  • 需要打开并行开关,即设置query_dop参数值大于1。
  • 需要打开自适应两阶段哈希聚合开关,即设置enable_adaptive_hashagg参数值为on
  • 该功能暂不支持向量化执行引擎。
  • 该功能不支持grouping sets、distinct聚合以及ordered-set聚合函数等场景。

示例

  1. 创建表,并插入数据。

    CREATE TABLE MogDB_adaptive_hashagg(a int , b int );
    INSERT INTO MogDB_adaptive_hashagg(a, b) select i / 2, i / 2 from generate_series( 1, 1000000) as t(i);
  2. 收集统计信息。

    ANALYZE MogDB_adaptive_hashagg;
  3. 开启并行查询开关,设置query_dop参数值大于1。同时开启自适应两阶段聚合算子开关。

    SET query_dop = 4;
    SET enable_adaptive_hashagg to on;
  4. 通过explain查看聚合查询详情。

    EXPLAIN (COSTS off , ANALYZE ) SELECT a, count ( *), sum (b), avg (b) FROM MogDB_adaptive_hashagg group by a;
    • 设置adaptive_hashagg_reduce_ratio_threshold(聚合后行数/聚合前行数)为0.4,而实际值为0.5,因此有 Passthrogh rows: 650034 行直接传给最终聚合阶段,即有650034行只执行了一阶段聚合。

      SET adaptive_hashagg_reduce_ratio_threshold = 0.4;
      EXPLAIN (COSTS off , ANALYZE ) SELECT a, count ( *), sum (b), avg (b) FROM MogDB_adaptive_hashagg group by a;
      
      QUERY PLAN                                                                                                           
      ---------------------------------------------------------------------------------------------------------------------
      Streaming(type: LOCAL GATHER dop: 1 / 4) (actual time =[ 390.677, 672.311]..[ 390.677, 672.311], rows = 500001)               
        - >  HashAggregate (actual time =[ 368.699, 589.262]..[ 373.300, 627.672], rows = 500001)                                  
              Group By Key: a                                                                                              
              Max File Num: 48  Min File Num: 48                                                                           
              - >  Streaming(type: LOCAL REDISTRIBUTE dop: 4 / 4) (actual time =[ 0.036, 205.972]..[ 4.657, 243.092], rows = 899897) 
                    - >  Adaptive HashAggregate (actual time =[ 7.003, 117.946]..[ 8.701, 150.899], rows = 899897)                 
                          Group By Key: a                                                                                  
                          Passthrough rows: 650034                                                                         
                          - >  Seq Scan on mogdb_adaptive_hashagg (actual time =[ 0.007, 19.261]..[ 0.009, 26.093], rows = 1000000)
    • 设置adaptive_hashagg_reduce_ratio_threshold(聚合后行数/聚合前行数)为 0.8。根据回显信息 Passthrough rows 为 0,可以看出此时没有回退到一阶段聚合。

      SET adaptive_hashagg_reduce_ratio_threshold = 0.8;
      EXPLAIN (COSTS off , ANALYZE ) SELECT a, count ( *), sum (b), avg (b) FROM MogDB_adaptive_hashagg group by a;
      
      QUERY PLAN                                                                                                            
      ----------------------------------------------------------------------------------------------------------------------
      Streaming(type: LOCAL GATHER dop: 1 / 4) (actual time =[ 385.932, 678.295]..[ 385.932, 678.295], rows = 500001)                
        - >  HashAggregate (actual time =[ 362.077, 562.587]..[ 369.987, 630.232], rows = 500001)                                   
              Group By Key: a                                                                                               
              Max File Num: 48  Min File Num: 48                                                                            
              - >  Streaming(type: LOCAL REDISTRIBUTE dop: 4 / 4) (actual time =[ 15.825, 217.394]..[ 23.797, 280.069], rows = 500045)
                    - >  Adaptive HashAggregate (actual time =[ 30.079, 203.190]..[ 34.597, 224.362], rows = 500045)                
                          Group By Key: a                                                                                   
                          Passthrough rows: 0                                                                               
                          - >  Seq Scan on mogdb_adaptive_hashagg (actual time =[ 0.007, 18.349]..[ 0.010, 20.279], rows = 1000000) 
    • 设置允许在预聚合阶段内存不足时落盘,即设置adaptive_hashagg_allow_spill参数值为true,可以从 Max File Num 看到此时发生了落盘。

      SET adaptive_hashagg_allow_spill = true;
      EXPLAIN (COSTS off , ANALYZE ) SELECT a, count ( *), sum (b), avg (b) FROM MogDB_adaptive_hashagg group by a;
      
      QUERY PLAN                                                                                                            
      ----------------------------------------------------------------------------------------------------------------------
      Streaming(type: LOCAL GATHER dop: 1 / 4) (actual time =[ 498.529, 773.567]..[ 498.529, 773.567], rows = 500001)                
        - >  HashAggregate (actual time =[ 476.078, 710.897]..[ 486.680, 734.490], rows = 500001)                                   
              Group By Key: a                                                                                               
              Max File Num: 48  Min File Num: 48                                                                            
              - >  Streaming(type: LOCAL REDISTRIBUTE dop: 4 / 4) (actual time =[ 67.091, 300.522]..[ 78.236, 439.433], rows = 500045)
                    - >  Adaptive HashAggregate (actual time =[ 82.496, 238.676]..[ 89.664, 309.068], rows = 500045)                
                          Group By Key: a                                                                                   
                          Passthrough rows: 0                                                                               
                          Max File Num: 48  Min File Num: 48                                                                
                          - >  Seq Scan on mogdb_adaptive_hashagg (actual time =[ 0.008, 19.271]..[ 0.017, 19.918], rows = 1000000) 
    • 设置adaptive_hashagg_min_rows参数用于判断是否适合两阶段的最小行数为10,000,000,由于此值超过了该表实际行数1,000,000,因此无法退化为一阶段聚合。

      SET adaptive_hashagg_min_rows = 10000000;
      
      RESET adaptive_hashagg_reduce_ratio_threshold;
      EXPLAIN (COSTS off , ANALYZE ) SELECT a, count ( *), sum (b), avg (b) FROM MogDB_adaptive_hashagg group by a;
      QUERY PLAN                                                                                                            
      ----------------------------------------------------------------------------------------------------------------------
      Streaming(type: LOCAL GATHER dop: 1 / 4) (actual time =[ 556.257, 843.716]..[ 556.257, 843.716], rows = 500001)                
        - >  HashAggregate (actual time =[ 533.540, 723.769]..[ 540.334, 796.572], rows = 500001)                                   
              Group By Key: a                                                                                               
              Max File Num: 48  Min File Num: 48                                                                            
              - >  Streaming(type: LOCAL REDISTRIBUTE dop: 4 / 4) (actual time =[ 69.097, 336.018]..[ 75.762, 457.721], rows = 500045)
                    - >  Adaptive HashAggregate (actual time =[ 85.874, 243.790]..[ 88.188, 319.401], rows = 500045)                
                          Group By Key: a                                                                                   
                          Passthrough rows: 0                                                                               
                          Max File Num: 48  Min File Num: 48                                                                
                          - >  Seq Scan on mogdb_adaptive_hashagg (actual time =[ 0.008, 19.203]..[ 0.011, 19.495], rows = 1000000) 

相关页面

query_dopenable_adaptive_hashaggadaptive_hashagg_reduce_ratio_threasholdadaptive_hashagg_min_rowsadaptive_hashagg_allow_spill

Copyright © 2011-2024 www.enmotech.com All rights reserved.