Greenplum 中的多级分区

Posted

技术标签:

【中文标题】Greenplum 中的多级分区【英文标题】:Multi-level partition in Greeplum 【发布时间】:2017-09-11 04:37:31 【问题描述】:

我想在 Greeplum 中创建一个多级分区表,第一级分区为一年,第二级为每 7 天。当我硬编码它工作正常。以下是代码:

DROP TABLE if exists pd.is_it_working;

CREATE TABLE pd.is_it_working
(
  ts timestamp without time zone,
  client_uname text
)
WITH (APPENDONLY=true, 
  OIDS=FALSE
)
DISTRIBUTED BY (client_uname)
PARTITION BY RANGE(ts)

        SUBPARTITION BY RANGE (ts)
        SUBPARTITION TEMPLATE 
        (
        START ('2015-06-01 00:00:00'::timestamp without time zone)INCLUSIVE 
        END ('2016-01-01 00:00:00'::timestamp without time zone) EXCLUSIVE
        EVERY ('1 week'::interval) 
        WITH (appendonly=true, orientation=parquet, compresstype=snappy, pagesize=1048576, rowgroupsize=8388608), 
        DEFAULT SUBPARTITION outlying_week  
        WITH (appendonly=true, orientation=parquet, compresstype=snappy, pagesize=1048576, rowgroupsize=8388608)
        )

(
START ('2015-06-01 00:00:00'::timestamp without time zone)INCLUSIVE 
END ('2016-01-01 00:00:00'::timestamp without time zone) EXCLUSIVE
EVERY ('1 year'::interval) 
WITH (appendonly=true, orientation=parquet, compresstype=snappy, pagesize=1048576, rowgroupsize=8388608), 
DEFAULT PARTITION outlying_year  
WITH (appendonly=true, orientation=parquet, compresstype=snappy, pagesize=1048576, rowgroupsize=8388608)
)
;
ALTER TABLE pd.is_it_working
  OWNER TO pdugar;

现在,问题是如何添加更多分区(例如 2016-2017 年的分区)以及随后的 7 天分区? 如果我有默认分区,则无法添加分区。如果我决定拆分默认分区,它不应该为空,否则我无法对其进行分区。此外,即使它不是空的,如果我拆分它,它将遵循上面定义的子分区模板,这对于新的一年是错误的,应该有一个新的子分区模板,即假设 2016-2017 年的子分区必须他们之间每隔 7 天!

当数据进入时,我必须在此表中动态创建一个新年分区(及其后续子分区),但我无法做到。我还需要在“时间戳”上进行分区。 有什么办法吗?

谢谢

【问题讨论】:

DISTRIBUTED BY 对 Postgres 无效 - 您真的在使用哪个 DBMS? 我正在使用基于 postgresql 的关键 greenplum 数据库。 【参考方案1】:

您不能拥有“默认”分区并添加新分区——因为默认分区可能包含应该在新分区上的数据。

在这种情况下,包含这些元组的查询将丢失数据,因为查询计划器使用分区消除来加快查询速度。

为了拥有该功能,您需要创建一个函数:

将默认分区复制到新表中 删除默认分区 更改表,添加新分区 从默认副本插入 更改表,添加默认分区(如果需要)

理想情况下,您不会使用默认分区,而是在必要时使用触发器根据日期范围创建新分区。然而,greenplum 不允许任何数据库更改语句在段上运行——所以,它就是函数!

看看这个例子:

https://dba.stackexchange.com/questions/126171/how-can-i-add-multiple-partitions-to-a-greenplum-table-using-dynamic-sql

【讨论】:

以上是关于Greenplum 中的多级分区的主要内容,如果未能解决你的问题,请参考以下文章

greenplum 分区优化

外部分区表 greenplum

如何让 Greenplum 4.2.3 只扫描预期的分区?

为啥在greenplum中,分区表使用nestedloop join,而非分区表使用hash join

使用 gp_segment_id 作为分区列从 greenplum 中并行获取数据

用于动态查询的 Greenplum PSQL 格式