GPDB-内核特性-GP7不再支持动态分区裁剪

简介: GPDB-内核特性-GP7不再支持动态分区裁剪

GPDB-内核特性-GP7不再支持动态分区裁剪


GreenPlum支持分区表的功能,并通过分区裁剪来减少读取的数据量。分区裁剪分为静态分区裁剪和动态分区裁剪。静态分区裁剪:执行计划在生成时,就通过条件值过滤出需要的子分区,执行时仅扫描裁剪后的分区即可;动态分区裁剪:发生在SQL执行阶段,需要根据维度表的数据动态分析出需要哪些分区。


GP6ORCA支持动态分区功能:


    set optimizer=on;
    explain select * from sales;
                                                  QUERY PLAN                                              
    ------------------------------------------------------------------------------------------------------
     Gather Motion 1:1  (slice1; segments: 1)  (cost=0.00..431.00 rows=1 width=16)
       ->  Sequence  (cost=0.00..431.00 rows=1 width=16)
             ->  Partition Selector for sales (dynamic scan id: 1)  (cost=10.00..100.00 rows=100 width=4)
                   Partitions selected: 366 (out of 366)
             ->  Dynamic Seq Scan on sales (dynamic scan id: 1)  (cost=0.00..431.00 rows=1 width=16)
     Optimizer: Pivotal Optimizer (GPORCA)
    (6 rows)

    引入SequencePartitionSelectorDynamicSeqScan等算子完成动态分区裁剪。PartitionSelector根据数据分析出需要哪些分区,DynamicSeqScan扫描对应分区,Sequence负责处理所有DynamicSeqScan算子。

    然而,GP7中进行测试时,发现执行计划不一样了:

      set optimizer=on;
      explain select * from sales;
                                             QUERY PLAN                                        
      -----------------------------------------------------------------------------------------
       Gather Motion 1:1  (slice1; segments: 1)  (cost=0.00..812886.00 rows=22179600 width=24)
         ->  Append  (cost=0.00..369294.00 rows=22179600 width=24)
               ->  Seq Scan on sales_1_prt_1  (cost=0.00..706.00 rows=60600 width=24)
               ->  Seq Scan on sales_1_prt_2  (cost=0.00..706.00 rows=60600 width=24)
               ->  Seq Scan on sales_1_prt_3  (cost=0.00..706.00 rows=60600 width=24)
                ................
                ................
               ->  Seq Scan on sales_1_prt_364  (cost=0.00..706.00 rows=60600 width=24)
               ->  Seq Scan on sales_1_prt_365  (cost=0.00..706.00 rows=60600 width=24)
               ->  Seq Scan on sales_1_prt_366  (cost=0.00..706.00 rows=60600 width=24)
       Optimizer: Postgres query optimizer
      (369 rows)

      发生了什么?经过分析查看GreenPlumissues,发现GP7竟然不支持动态分区了:

      https://github.com/greenplum-db/gpdb/issues/11363

      Partition table support in Orca was disabled for the master branch and we currently fall back to planner on all queries on partition tables. We are actively working to add this functionality back (eg: #11336 re-introduces support for static partition elimination).

      Master分支中,目前是GP7Orca禁用了分区表,执行计划又回到要查询所有分区表。我们正在积极做这个事,#11336重新引入支持静态分区裁剪功能:

      https://github.com/greenplum-db/gpdb/pull/11336

      Does this mean there will be no Dynamic scan node added to the plan?

      @JunfengYang Yes, our current plan is to not use DynamicXXXScan nodes anymore, and use the Append node (just as in Planner) with enumerated Scan node children.

      当前版本计划,不再使用DynamicXXXScan节点了,而是使用带有枚举Scan子节点的Append节点完成。

      那么,GP7中如何实现动态分区裁剪的效果呢?

        Gather Motion
          ->Nest Loop
            ->Append
              ->SeqScan on tpart1
              ->SeqScan on tpart2
              ->...
              ->SeqScan on tpartn
            ->Material
              ->Partition Selector
                ->SeqScan on t1

        比如一个nest loop join,通过顺序扫描表t1,将他的值都扫描出来,然后通过PartitionSelector算子判断这些值落在哪个分区表中,并将所有值通过Material算子物化;Append算子根据PartitionSelector算子计算的分区,顺序扫描这些的到的分区得到值,与Material算子物化值进行join。

        目录
        相关文章
        |
        存储 关系型数据库 索引
        GPDB-内核特性-GP7动态分区裁剪
        GP7动态分区裁剪机制
        138 0
        |
        数据采集 移动开发 数据可视化
        空间转录组|Load10X_Spatial函数修改适配多形式数据 + 空转标准流程
        空间转录组|Load10X_Spatial函数修改适配多形式数据 + 空转标准流程
        653 0
        |
        SQL 弹性计算 关系型数据库
        PostgreSQL 12 preview - CTE 增强,支持用户语法层控制 materialized 优化
        标签 PostgreSQL , CTE , materialized , not materialized , push down 背景 PostgreSQL with 语法,能跑非常复杂的SQL逻辑,包括递归,多语句物化计算等。 在12以前的版本中,WITH中的每一个CTE(common table express),都是直接进行物化的,也就是说外层的条件不会推到CTE(物化节点)里
        1005 0
        |
        7月前
        |
        存储 并行计算 关系型数据库
        PolarDB 开源版通过pg_rational插件支持Stern-Brocot trees , 实现高效自定义顺序和调整顺序需求
        背景PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力.本文将介绍PolarDB 开源版通过pg_rational插件支持Stern-Bro...
        98 0
        |
        存储 并行计算 Cloud Native
        PolarDB 开源版通过pg_rational插件支持Stern-Brocot trees , 实现高效自定义顺序和调整顺序需求
        PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力. 本文将介绍PolarDB 开源版通过pg_rational插件支持Stern-Brocot trees , 实现高效自定义顺序和调整顺序需求.
        177 0
        |
        分布式计算 Spark
        SPARK最新特性Runtime Filtering(运行时过滤)以及与动态分区裁剪的区别
        SPARK最新特性Runtime Filtering(运行时过滤)以及与动态分区裁剪的区别
        613 0
        SPARK最新特性Runtime Filtering(运行时过滤)以及与动态分区裁剪的区别
        |
        存储 编译器 程序员
        C++内存分区模型分析与实例以及扩展
        C++程序在执行时,将内存大方向划分为**5个区域** 运行前: - 代码区:存放**函数体的二进制代码**,由操作系统进行管理的 - 全局区(静态区):存放**全局变量和静态变量以及常量** - 常量区:**常量**存储在这里,不允许修改 运行后: - 栈区:由编译器自动分配释放, 存放**函数的参数值**,**局部变量等** - 堆区:**由程序员分配和释放**,若程序员不释放,程序结束时由操作系统回收
        216 0
        C++内存分区模型分析与实例以及扩展
        |
        SQL 调度 数据库