0


openGauss 3.1.0 的新型选择率模型大解密

国产数据库openGauss 9.30日新出了3.1.0版本,有哪些新的特性呢?我们计划出个系列详细介绍一下,期望大家多多支持~
选择率估算作为代价模型行数估算的基础,其准确性影响着优化器查询计划的选取,数据库优化器生成的不同查询计划之间可以达到数个数量级的区别。

文章目录

一、当前经典数据库优化器对于等值查询估计的缺点

例如,目前形如

a = 1

的等值谓词选择率估算可以有以下几种方法:

1. 利用统计信息估算:

  • 对查询语句中的等值条件,可分为MCV值和非MCV值进行估算:

  • 对MCV值,使用MCV对应的频率统计信息作为选择率;

  • 对非MCV值,使用如下经验公式:

      e
     
     
      q
     
     
      _
     
     
      
       s
      
      
       e
      
      
       l
      
      
       e
      
      
       c
      
      
       t
      
      
       i
      
      
       v
      
      
       i
      
      
       t
      
      
       y
      
     
     
      =
     
     
      
       
        1
       
       
        −
       
       
        s
       
       
        u
       
       
        m
       
       
        _
       
       
        m
       
       
        c
       
       
        v
       
       
        −
       
       
        n
       
       
        u
       
       
        m
       
       
        _
       
       
        n
       
       
        u
       
       
        l
       
       
        l
       
       
        s
       
      
      
       
        n
       
       
        d
       
       
        v
       
      
     
    
    
     eq\_{selectivity}=\frac{1-sum\_mcv-num\_nulls}{ndv}
    

    eq_selectivity=ndv1−sum_mcv−num_nulls​

  • 直接对所有值做均匀假设,不考虑MCV:

      e
     
     
      q
     
     
      _
     
     
      
       s
      
      
       e
      
      
       l
      
      
       e
      
      
       c
      
      
       t
      
      
       i
      
      
       v
      
      
       i
      
      
       t
      
      
       y
      
     
     
      =
     
     
      
       
        n
       
       
        u
       
       
        m
       
       
        _
       
       
        r
       
       
        o
       
       
        w
       
       
        s
       
       
        −
       
       
        n
       
       
        u
       
       
        m
       
       
        _
       
       
        n
       
       
        u
       
       
        l
       
       
        l
       
       
        s
       
      
      
       
        n
       
       
        d
       
       
        v
       
      
     
     
      /
     
     
      n
     
     
      u
     
     
      m
     
     
      _
     
     
      r
     
     
      o
     
     
      w
     
     
      s
     
    
    
     eq\_{selectivity}=\frac{num\_rows-num\_nulls}{ndv}/num\_rows
    

    eq_selectivity=ndvnum_rows−num_nulls​/num_rows

2. 在线计算:

  • 使用Count-Mean-Min Sketch等频率估算方法,在线计算每个常量值的选择率。

在上述方法中,方法1对全部或者部分数据做均匀分布假设,计算量小,优化器负担轻,但估算粗略,对大多数常量选择率估值不准确;方法2对每个常量值都进行单独的计算,计算结果较为准确,但是优化器的计算负担大,将对性能产生影响。

二、openGauss的新型选择率模型

基于上述经典优化器的缺点,在该版本的openGauss数据库中,我们通过调整等值谓词选择率的估算方法,构造出openGauss的新型选择率模型,可以在兼顾准确率与计算量的前提下,进行选择率的估计。该模型原理如下:

  • 对MCV值,使用MCV对应的频率统计信息作为选择率;
  • 对不落入MCV也不落入直方图的值,使用如下公式: e q _ s e l e c t i v i t y = 1 r o w s eq_{selectivity}=\frac{1}{rows} eq_selectivity=rows1​
  • 对落入直方图的值 - 桶左右边界相等,使用桶的数量估算常量选择率: e q _ s e l e c t i v i t y = h e i g h t _ o f _ h i s t o g r a m ∗ n u m _ e q _ s l o t eq_selectivity=height_of_histogram * num_eq_slot eq_selectivity=height_of_histogram∗num_eq_slot e q _ s e l e c t i v i t y = 1 − n u l l _ f r a c t i o n − s u m _ m c v n u m _ s l o t ∗ n u m _ e q _ s l o t eq_selectivity=\frac{1-null_fraction-sum_mcv}{num_slot}*num_eq_slot eq_selectivity=num_slot1−null_fraction−sum_mcv​∗num_eq_slot- 桶左右边界不等,使用插值方法,估算常量选择率: e q _ s e l e c t i v i t y = h e i g h t _ o f _ h i s t o g r a m ∗ f r e q _ o f _ c o n s t _ i n _ s l o t eq_selectivity=height_of_histogram * freq_of_const_in_slot eq_selectivity=height_of_histogram∗freq_of_const_in_slot e q _ s e l e c t i v i t y = 1 − n u l l _ f r a c t i o n − s u m _ m c v n u m _ s l o t ∗ ( h i g h − l o w ) d i s t i n c t ∗ ( r i g h t − l e f t ) eq_selectivity=\frac{1-null_fraction-sum_mcv}{num_slot}\frac{(high-low)}{distinct(right-left)} eq_selectivity=num_slot1−null_fraction−sum_mcv​∗distinct∗(right−left)(high−low)​

新型选择率模型平衡计算量与准确性,充分考虑数据分布情况,通过轻量的计算,能够使得优化器生成更优的执行计划,该特性可通过GUC参数var_eq_const_selectivity控制。

三、使用示例

假设在数据库中表t1由2列组成,分别为列a和列b,其类型均为整型(INT)。向其插入数据,a值为101的数据共有300行,a值为1到100的数据各有100行,a值为150的数据150,000行,a值为200的数据有1行。则表t1由数据库得到的统计信息可如下:
统计信息值NULL值比例0distinct总数103MCV值150MCV频率0.9369直方图边界1,2,3,4,5,6,7,8,9,10, 11,12,13,14,15,16,17,18,19,20, 21,22,23,24,25,26,28,29,30, 31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,48,49,50, 51,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,68,69,70,71,72,73,74,75,76,77,78,79,79,80, 82,83,84,85,86,88,89,90,91,92,93,94,95,96,96,97,98,99,100,101,101,101
当查询语句为

SELECT * FROM t1 WHERE a = 101;

时,可知a落入直方图桶

[101,101)

中,且与当前桶左右边界相同的桶的总个数为2,则a的选择率为

(1 – 0 – 0. 9369) / 100 * 2 = 3.9816e-7

当查询为

SELECT * FROM t1 WHERE a = 11;

时,可知a落入直方图桶

[11,12)

中,该桶在均匀假设的前提下,分配到的distinct值数量为

103 / (101 - 1) * (12 – 11) ,则a的选择率为(1 – 0 – 0. 9369) / 100 /(103 / (101 - 1) * (12 – 11) ) = 6.1262e-4

当查询为

SELECT * FROM t1 WHERE a = 200;

时,常量值200没有落入MCV,也没有落入直方图的任何一个桶中,则利用t1的总行数160301来预估其选择率,则a的选择率为

1 / 160301 = 6.2383e-6

从上面的示例可以看出,使用新型选择率模型,充分考虑了不同常量值的选择率,其选择率估算能够更加贴近实际值。此外,openGauss还会在数据库的查询优化领域进一步努力,构造业内顶尖的数据库查询优化能力。


openGauss: 一款高性能、高安全、高可靠的企业级开源关系型数据库。

🍒如果您觉得博主的文章还不错或者有帮助的话,请关注一下博主,如果三连收藏支持就更好啦!谢谢各位大佬给予的鼓励!

标签: 数据库 云原生 sql

本文转载自: https://blog.csdn.net/GaussDB/article/details/127301882
版权归原作者 Gauss松鼠会 所有, 如有侵权,请联系我们删除。

“openGauss 3.1.0 的新型选择率模型大解密”的评论:

还没有评论