【问题标题】:Greenplum add multiple partitions by range to existing tableGreenplum按范围向现有表添加多个分区
【发布时间】:2022-02-25 00:01:52
【问题描述】:

无法通过 documentation 将分区添加到 Pivotal Greenplum 中的现有分区表中

create table tab_name
(
    day_dt date,
    id text,
    s_id text,
    type text,
    amt numeric(19,4)
)
distributed randomly
partition by range (day_dt)
    (
    start (date '2020-09-18') inclusive
    end (date '2020-10-02') exclusive
    every (interval '1 day')
    );

这是 DDL。 我需要在 2020-10-02 之后的每一天都添加新分区,然后再将数据添加到表中。

ALTER TABLE tab_name ADD PARTITION
             START (date '2020-10-02') INCLUSIVE
             END (date '2020-11-01') EXCLUSIVE;

但是这个只会创建一个分区,我每天都需要。

【问题讨论】:

    标签: sql database-partitioning greenplum


    【解决方案1】:

    我不知道有任何ALTER TABLE ... ADD PARTITION 命令变体,它允许递归添加多个分区。我知道您一次只能在现有分区模式的“边缘”添加一个分区。

    关于如何实现所描述的内容的一些想法包括:

    • 发出多个ALTER TABLE ... ADD PARTITION 语句(可能包装在允许您执行递归操作的函数中)
    • 在添加/交换/拆分新分区之前,为不在 (2020-09-18, 2020-10-02) 范围内的所有日期添加默认分区

    【讨论】:

      【解决方案2】:

      创建一个以datestart text,dateend text,table_schema text,table_name text为参数并循环添加分区的动态函数。

      CREATE OR REPLACE FUNCTION partitionfunction(datestart text,dateend text,table_schema text,table_name text)
          RETURNS void
          LANGUAGE plpgsql
          VOLATILE
      AS $$
          
      declare
      var_Table_schema text;
      var_Table_name text;
      var_dateStart date;
      var_dateEnd date;
      var_endPartition date;
      BEGIN
      var_Table_schema := Table_schema;
      var_Table_name := Table_name;
      var_dateStart := to_date(dateStart,'YYYY-MM-DD');
      var_dateEnd := to_date(dateEnd,'YYYY-MM-DD');
      WHILE var_dateStart < var_dateEnd
      loop
      var_endPartition = var_dateStart + interval '1 DAY'; --You can also change it for weeks or days
      execute ' alter table '|| Table_schema ||'.'|| Table_name || '
      add partition start('''||var_dateStart||''') end(
      '''||var_endPartition||''')';
      var_dateStart = var_dateStart + interval '1 DAY'; --You can also change it for weeks or days
      END loop;
      end;
      
      $$
      EXECUTE ON ANY;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-13
        • 1970-01-01
        • 2017-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多