greenplum 分区优化

Posted

技术标签:

【中文标题】greenplum 分区优化【英文标题】:greenplum partition optimization 【发布时间】:2011-12-15 01:48:02 【问题描述】:

在 greenplum 上,我有一个名为 fact_table 的大表,它由 RANGE(day_bucket) 分区。为什么以下查询这么慢:

select max(day_bucket) from fact_table where day_bucket >= '2011-09-11 00:00:00' and day_bucket < '2011-12-14'.

我想它应该只查看每个分区的头部并立即返回结果,因为同一 day_bucket 列的每个分区。但是 greenplum 进行了一次 FULL 扫描来计算结果。谁能给我解释一下原因?


更新:

感谢您回答我的问题,但这对您的提示没有帮助。 Greenplum 总是进行全面扫描,即使我使用 PARTITION BY LIST(day_bucket) 创建表:

创建表事实表( id 字符变化(25)NOT NULL, 没有时区的 day_bucket 时间戳 NOT NULL, ) WITH (appendonly=true, orientation=column, compresstype=zlib, compresslevel=6) 分配者 (user_id) 分区列表 (day_bucket) ( 分区 p20120101 值 ('2012-01-01 00:00:00'::timestamp without time zone) WITH (tablename='fact_table_1_prt_p20120101', appendonly=true,orientation=column, compresstype=zlib, compresslevel=6), 分区 p20120102 值 ('2012-01-02 00:00:00'::timestamp without time zone) WITH (tablename='fact_table_1_prt_p20120102', appendonly=true,orientation=column, compresstype=zlib, compresslevel=6), 分区 p20120103 值 ('2012-01-03 00:00:00'::timestamp without time zone) WITH (tablename='fact_table_1_prt_p20120103', appendonly=true,orientation=column, compresstype=zlib, compresslevel=6), 分区 p20120104 值 ('2012-01-04 00:00:00'::timestamp without time zone) WITH (tablename='fact_table_1_prt_p20120104', appendonly=true,orientation=column, compresstype=zlib, compresslevel=6), ......

解释命令显示它总是进行全扫描:

-> mytestlist_1_prt_p20120102 mytestlist 上的仅追加列扫描(成本=0.00..34.95 行=1 宽度=8) 过滤器:day_bucket >= '2012-01-02 00:00:00'::timestamp without time zone AND day_bucket 在 mytestlist_1_prt_p20120103 mytestlist 上仅追加列扫描(成本=0.00..39.61 行=1 宽度=8) 过滤器:day_bucket >= '2012-01-02 00:00:00'::timestamp without time zone AND day_bucket

【问题讨论】:

桌子上有索引吗?每个分区平均有多少行? 以后请编辑您的问题以添加更多信息。而且,我已经合并了您似乎意外创建的额外帐户。 您使用的是什么版本的 GPDB?你能发布一个完整的解释计划吗? 【参考方案1】:

您应该注意应用于分区的约束。 为了让优化器正确地从扫描中排除一些分区,你应该帮助他。在您的情况下,您应该使用显式类型转换:(GP 在计划阶段无法自动理解像 'yyyy-mm-dd' 这样的刺痛实际上是时间戳)

select max(day_bucket) 
from fact_table 
where day_bucket >= '2011-09-11 00:00:00'::timestamp 
  and day_bucket <  '2011-12-14'::timestamp

【讨论】:

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

Greenplum优化--SQL调优篇

外部分区表 greenplum

Greenplum 中的多级分区

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

在 Greenplum DB [大数据] 上选择分区策略的更好实践

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