---
title: openGauss 3.1.0的新型选择率模型大解密-官方技术文章-鲲鹏社区
description: 本文主要介绍openGauss 3.1.0的新型选择率模型原理及使用示例。
keywords: Gauss,的新型选择率,模型大解密,官方技术文章,鲲鹏社区,当前经典数据,库优化器对于,等值查询估计
url: https://www.hikunpeng.com/developer/techArticles/20230914-11?envFlag=1
section: (其他)
---

# openGauss 3.1.0的新型选择率模型大解密-官方技术文章-鲲鹏社区

URL: https://www.hikunpeng.com/developer/techArticles/20230914-11?envFlag=1
描述: 本文主要介绍openGauss 3.1.0的新型选择率模型原理及使用示例。
关键词: Gauss,的新型选择率,模型大解密,官方技术文章,鲲鹏社区,当前经典数据,库优化器对于,等值查询估计

官方技术文章 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles)

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

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

实战经验

发表于 2022/10/12

0

选择率估算作为代价模型行数估算的基础，其准确性影响着优化器查询计划的选取，数据库优化器生成的不同查询计划之间可以达到数个数量级的区别。

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

例如，目前形如a = 1的等值谓词选择率估算可以有以下几种方法：

### 1. 利用统计信息估算

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

（1）对MCV值，使用MCV对应的频率统计信息作为选择率；

（2）对非MCV值，使用如下经验公式：

直接对所有值做均匀假设，不考虑MCV：

### 2. 在线计算

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

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

## openGauss的新型选择率模型

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

（1）对MCV值，使用MCV对应的频率统计信息作为选择率；

（2）对不落入MCV也不落入直方图的值，使用如下公式：

（3）对落入直方图的值

1）桶左右边界相等，使用桶的数量估算常量选择率：

2）桶左右边界不等，使用插值方法，估算常量选择率：

新型选择率模型平衡计算量与准确性，充分考虑数据分布情况，通过轻量的计算，能够使得优化器生成更优的执行计划，该特性可通过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值比例 | 0 |
| distinct总数 | 103 |
| MCV值 | 150 |
| MCV频率 | 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,6061,62,63,6465,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数据库中的函数依赖关系 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles/20230914-10?envFlag=1)

openGauss 3.1.0版本正式发布 | 七个方面全面增强 [了解详情](https://mp.weixin.qq.com/s?__biz=MzIyMDE3ODk1Nw==&mid=2247505211&idx=1&sn=fbad1bc119b28296bfbd2f3e8845c4b5&chksm=97cd6a59a0bae34f5614050fac1bf5cf814d2db0f526fd9c0c3ccb6cd479d281b2bb2809b22b&scene=21#wechat_redirect)

本页内容
