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中,分区表使用nestedloop join,而非分区表使用hash join