greenplum分区如何支持varchar数据类型

问题描述

脚本为:

create table T_RH_AJ_XW_JCJJJ2 (
   ZJ_ID                VARCHAR(32)          not null,JJ_RQ                VARCHAR(32),RK_SJ                TIMESTAMP,GX_SJ                TIMESTAMP,SJZT_W               VARCHAR(32)
)
distributed by (ZJ_ID)
partition by range (JJ_RQ)
(
     START ('2012-08-11'::date) END ('2012-08-12'::date)
     EVERY ( INTERVAL '1 day')
);   

我要分区使用varchar列(JJ_RQ数据类型,此列值为'2020-11-08'; 但这是一个错误

错误是“运算符不存在:字符变化+间隔,没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。

解决方法

我从未与Greenplum合作,但是它基于PostgreSQL,所以我尝试一下:

JJ_RQ列的类型应该为datetimestamp,因为EVERY子句试图向i添加一个INTERVAL值。

,

您应该修复表,以使jj_rq是时间戳或日期,才能正确执行此操作。但是,如果必须按varchar进行分区,则可以使用列表分区。

create table T_RH_AJ_XW_JCJJJ2 (
   ZJ_ID                VARCHAR(32)          not null,JJ_RQ                VARCHAR(32),RK_SJ                TIMESTAMP,GX_SJ                TIMESTAMP,SJZT_W               VARCHAR(32)
)
distributed by (ZJ_ID)
partition by list (JJ_RQ)
(
     partition part1 values ('2012-08-11'),partition part2 values ('2012-08-12')
); 

小型表无法从分区中受益,因此我假设您的表较大。为了帮助减少磁盘I / O,您应该使用附加的优化表,也可能使用压缩。文件较小,扫描时间更少。

create table T_RH_AJ_XW_JCJJJ2 (
   ZJ_ID                VARCHAR(32)          not null,SJZT_W               VARCHAR(32)
)
with (appendonly=true)
distributed by (ZJ_ID)
partition by list (JJ_RQ)
(
     partition part1 values ('2012-08-11'),partition part2 values ('2012-08-12')
);   

这是固定数据类型的最佳方法。

create table T_RH_AJ_XW_JCJJJ2 (
   ZJ_ID                VARCHAR(32)          not null,JJ_RQ                timestamp,SJZT_W               VARCHAR(32)
)
with (appendonly=true)
distributed by (ZJ_ID)
partition by range (JJ_RQ)
(
START ('2012-08-11'::timestamp) END ('2012-08-12'::timestamp)
EVERY ( INTERVAL '1 day')
);