技术编程openGauss魔改PG?它能兼容Oracle的数据库表吗?( 三 )


LINE 6: )organization index;五、簇表
簇表也称为Cluster , 在没有数据表和索引的时候 , Cluster段是可以单独存在的 。 依据一定的规则 , 如连接键(Join Key) , 可以将多个数据表数据保存在同一个段中 。 并且依据一定场景实现快速检索连接 。 在openGauss中 , 无法兼容此功能 。
postgres=# create cluster t_cluster (id number) size 600;
ERROR: syntax error at or near "cluster"
LINE 1: create cluster t_cluster (id number) size 600;
在某些为了提高连接性能的情况下 , 可以考虑用列存与partial cluster key结合的方式替代 , 表定义中可以选取某一列或几列设置为partial cluster key 。
在导入数据时 , 按设置的列进行局部排序(默认每70个CU即420万行排序一次) , 生成的CU会聚集在一起 , 即CU的min,max会在一个较小的区间内 。 当查询时 , where条件含有这些列时 , 可产生良好的过滤效果 。
postgres=# CREATE TABLE WAREHOUSE
W_WAREHOUSE_SK INTEGER NOT NULL,
W_WAREHOUSE_ID CHAR(16) NOT NULL,
W_WAREHOUSE_NAME VARCHAR(20) ,
PARTIAL CLUSTER KEY(W_WAREHOUSE_SK, W_WAREHOUSE_ID)
) WITH (ORIENTATION = COLUMN);六、分区表
分区表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表 。 对于应用来说 , 逻辑上只有一个表 , 但在物理上这个表由多个物理分区组成 。 每个分区都是一个独立的对象 , 可以独自处理 , 也可以作为一个更大对象的一部分进行处理 。 分区表通常分为范围分区、列表分区、哈希分区以及复合分区 。
1、范围分区
范围分区就是对数据表中的某个值的范围进行分区 , 根据某个值的范围 , 决定将该数据存储在哪个分区上 。 如根据序号分区 , 根据业务记录的创建日期进行分区等(联通每个月的账单记录就用的分区表存储) 。 在openGauss中 , 可以支持范围分区 。
postgres=# CREATE TABLE t_range_partition
( prod_id NUMBER(6)
, cust_id NUMBER
, time_id DATE
, channel_id CHAR(1)
, promo_id NUMBER(6)
, quantity_sold NUMBER(3)
, amount_sold NUMBER(10,2)
) PARTITION BY RANGE (time_id)
(PARTITION sales_q1_2006 VALUES LESS THAN (TO_DATE('01-APR-2006','dd-MON-yyyy')) TABLESPACE pg_default, PARTITION sales_q2_2006 VALUES LESS THAN (TO_DATE('01-JUL-2006','dd-MON-yyyy')) TABLESPACE pg_default, PARTITION sales_q3_2006 VALUES LESS THAN (TO_DATE('01-OCT-2006','dd-MON-yyyy')) TABLESPACE pg_default, PARTITION sales_q4_2006 VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy')) TABLESPACE pg_default );
CREATE TABLE
2、列表分区
列表分区是根据所有可能的值 , 指定应该插入相应的分区 , openGauss当前版本无法支持列表分区 。
postgres=# CREATE TABLE t_list_partition_table
(id number,
name varchar2(20),
sales number(10, 2),
state varchar2(2))
PARTITION BY LIST (state)
(PARTITION q1_northwest VALUES ('OR', 'WA'),
PARTITION q1_southwest VALUES ('AZ', 'UT', 'NM'),
PARTITION q1_northeast VALUES ('NY', 'VM', 'NJ'),
PARTITION q1_southeast VALUES ('FL', 'GA'),
PARTITION q1_northcentral VALUES ('SD', 'WI'),
PARTITION q1_southcentral VALUES ('OK', 'TX'));
ERROR: syntax error at or near "LIST"
LINE 6: PARTITION BY LIST (state)
3、散列分区
散列(HASH)分区通过在分区键值上执行一个散列函数来说决定数据的物理位置 。 散列分区把记录分布在比范围分区更多的分区上 , 这减少了I/O争用的可能性 。 openGauss当前版本无法支持散列(HASH)分区 。


推荐阅读