DBAplus社群 openGauss魔改PG?它能兼容Oracle的数据库表吗?( 三 )


postgres=#createclustert_cluster(idnumber)size600;
ERROR:syntaxerroratornear"cluster"
LINE1:createclustert_cluster(idnumber)size600;
在某些为了提高连接性能的情况下 , 可以考虑用列存与partialclusterkey结合的方式替代 , 表定义中可以选取某一列或几列设置为partialclusterkey 。
在导入数据时 , 按设置的列进行局部排序(默认每70个CU即420万行排序一次) , 生成的CU会聚集在一起 , 即CU的min,max会在一个较小的区间内 。 当查询时 , where条件含有这些列时 , 可产生良好的过滤效果 。
postgres=#CREATETABLEWAREHOUSE
W_WAREHOUSE_SKINTEGERNOTNULL,
W_WAREHOUSE_IDCHAR(16)NOTNULL,
W_WAREHOUSE_NAMEVARCHAR(20),
PARTIALCLUSTERKEY(W_WAREHOUSE_SK,W_WAREHOUSE_ID)
)WITH(ORIENTATION=COLUMN);六、分区表
分区表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表 。 对于应用来说 , 逻辑上只有一个表 , 但在物理上这个表由多个物理分区组成 。 每个分区都是一个独立的对象 , 可以独自处理 , 也可以作为一个更大对象的一部分进行处理 。 分区表通常分为范围分区、列表分区、哈希分区以及复合分区 。
1、范围分区
范围分区就是对数据表中的某个值的范围进行分区 , 根据某个值的范围 , 决定将该数据存储在哪个分区上 。 如根据序号分区 , 根据业务记录的创建日期进行分区等(联通每个月的账单记录就用的分区表存储) 。 在openGauss中 , 可以支持范围分区 。
postgres=#CREATETABLEt_range_partition
(prod_idNUMBER(6)
,cust_idNUMBER
,time_idDATE
,channel_idCHAR(1)
,promo_idNUMBER(6)
,quantity_soldNUMBER(3)
,amount_soldNUMBER(10,2)
)PARTITIONBYRANGE(time_id)
(PARTITIONsales_q1_2006VALUESLESSTHAN(TO_DATE('01-APR-2006','dd-MON-yyyy'))TABLESPACEpg_default,PARTITIONsales_q2_2006VALUESLESSTHAN(TO_DATE('01-JUL-2006','dd-MON-yyyy'))TABLESPACEpg_default,PARTITIONsales_q3_2006VALUESLESSTHAN(TO_DATE('01-OCT-2006','dd-MON-yyyy'))TABLESPACEpg_default,PARTITIONsales_q4_2006VALUESLESSTHAN(TO_DATE('01-JAN-2007','dd-MON-yyyy'))TABLESPACEpg_default);
CREATETABLE
2、列表分区
列表分区是根据所有可能的值 , 指定应该插入相应的分区 , openGauss当前版本无法支持列表分区 。
postgres=#CREATETABLEt_list_partition_table
(idnumber,
namevarchar2(20),
salesnumber(10,2),
statevarchar2(2))
PARTITIONBYLIST(state)
(PARTITIONq1_northwestVALUES('OR','WA'),
PARTITIONq1_southwestVALUES('AZ','UT','NM'),
PARTITIONq1_northeastVALUES('NY','VM','NJ'),
PARTITIONq1_southeastVALUES('FL','GA'),
PARTITIONq1_northcentralVALUES('SD','WI'),
PARTITIONq1_southcentralVALUES('OK','TX'));
ERROR:syntaxerroratornear"LIST"
LINE6:PARTITIONBYLIST(state)
3、散列分区
散列(HASH)分区通过在分区键值上执行一个散列函数来说决定数据的物理位置 。 散列分区把记录分布在比范围分区更多的分区上 , 这减少了I/O争用的可能性 。 openGauss当前版本无法支持散列(HASH)分区 。
postgres=#CREATETABLEt_hash_partition
(deptnoNUMBER,deptnameVARCHAR(32))
PARTITIONBYHASH(deptno)
(PARTITIONp1TABLESPACEpg_default,PARTITIONp2TABLESPACEpg_default,
PARTITIONp3TABLESPACEpg_default,PARTITIONp4TABLESPACEpg_default);
ERROR:syntaxerroratornear"HASH"