GreenPlum和openGauss进行简单聚合时对扫描列的区别

简介: GreenPlum和openGauss进行简单聚合时对扫描列的区别

GreenPlumPG优化器下针对列存表执行单列聚集时(无过滤条件),不管聚集中包含多少列,都需要将所有列扫描上来。比如select avg(id1) from t1。扫描时,不仅将id1列的数据读取出来,还会将其他列的数据也读取上来。一旦列里有变长数据,无疑会显著拖慢扫描速度。

这是怎么做到的?在哪里设置的需要读取所有列?以及为什么要这么做?

1、首先,需要知道如何确定扫描哪些列。GPaocs_getnext函数中columScanInfo信息有投影列数和投影列数组,由此决定需要读取哪些列值:

2、接着就需要了解columScanInfo信息来自哪里

aoco_beginscan_extractcolumn函数对列进行提取,也就是targetlistqual

3、顺藤摸瓜,targetlistqual来自哪里?

SeqNext函数中,可以看到SeqScan计划节点的targetlistqual。由此可以知道他们来自执行计划中:

4、这样,就需要知道执行计划如何生成,targetlist链表是如何初始化的

create_plan是执行计划的生成入口。如果select id1 from t1,无聚合,那么入口的flag标签是CP_EXACT_TLIST,进入create_scan_plan后,use_physical_tlist函数依据该标签立即返回false,使用build_path_tlist构建targetlist,仅获取表id1列:

plan = create_plan_recurse(root,best_path,CP_EXACT_TLIST);

       plan = create_scan_plan(root,best_path,flags)  

而使用select avg(id1) from t1时,执行计划的首节点是AGG

plan = create_plan_recurse(root,best_path,CP_EXACT_TLIST);

到扫描节点处的标签是CP_LABEL_TLIST了,所以use_physical_tlist函数返回true,通过build_physical_tlist函数构建targetlist链表,该函数将所有列都构建了进去。

为什么要这么做呢?

5openGauss的聚合下列扫描仅扫描1列,它是如何做到的?

通过create_cstorescan_plan构建targetlist,可以看到它将传进来的tlist释放掉了,通过函数build_relation_tlist重新构建,此函数构建时,仅将聚合列构建进去。

目录
相关文章
|
存储 关系型数据库 PostgreSQL
|
3月前
|
SQL 缓存 关系型数据库
MySQL高级篇——关联查询和子查询优化
左外连接:优先右表创建索引,连接字段类型要一致、内连接:驱动表由数据量和索引决定、 join语句原理、子查询优化:拆开查询或优化成连接查询
MySQL高级篇——关联查询和子查询优化
|
3月前
|
存储 关系型数据库 MySQL
MySQL高级篇——覆盖索引、前缀索引、索引下推、SQL优化、主键设计
覆盖索引、前缀索引、索引下推、SQL优化、EXISTS 和 IN 的区分、建议COUNT(*)或COUNT(1)、建议SELECT(字段)而不是SELECT(*)、LIMIT 1 对优化的影响、多使用COMMIT、主键设计、自增主键的缺点、淘宝订单号的主键设计、MySQL 8.0改造UUID为有序
MySQL高级篇——覆盖索引、前缀索引、索引下推、SQL优化、主键设计
|
6月前
|
关系型数据库 PostgreSQL
postgresql如何将没有关联关系的两张表的字段合并
【6月更文挑战第2天】postgresql如何将没有关联关系的两张表的字段合并
158 3
|
SQL 关系型数据库 数据库
postgresql中连接两张表更新第三张表(updata)
如何结合两张表的数据来更新第三张表
360 0
|
存储 关系型数据库 PostgreSQL
PostgreSQL表扫描方法解析
PostgreSQL表扫描方法解析
131 0
|
存储 SQL 缓存
【MySQL高级】查询缓存、合并表、分区表
【MySQL高级】查询缓存、合并表、分区表
226 0
【MySQL高级】查询缓存、合并表、分区表
|
关系型数据库 MySQL 索引
MySQL普通索引和唯一索引到底什么区别?(上)
MySQL普通索引和唯一索引到底什么区别?(上)
208 0
MySQL普通索引和唯一索引到底什么区别?(上)
|
缓存 关系型数据库 MySQL
MySQL普通索引和唯一索引到底什么区别?(下)
MySQL普通索引和唯一索引到底什么区别?(下)
137 0
MySQL普通索引和唯一索引到底什么区别?(下)