[LightDB兼容增强]支持 Oracle 复合分区 list+hash
背景:
Oracle自11g起逐步完善了分区相关的支持,形成了以list, hash, range为核心的基础分区逻辑。
通常来说,各分区逻辑的实用场景如下:
1,list分区:以列离散值进行分区隔离,如程序代码中的switch case。通常用于根据地理位置,城市名称,等有固定值的列进行分区管理。
2,hash分区:hash分区并无明显的逻辑特征,一般仅用于将大表拆成小表,保持一般意义上的表数据均匀分布即可。
3,range分区:range分区基于列的取值范围划分分区,特别适合于增量数据中某列程逐渐增加取值的表。比如基于列日期,列自增ID等。
在Oracle中,除了单独应用于以上分区逻辑实现分区外,我们还可以进行两两组合,进行二次分区。 如下表所示:
list | hash | range | |
list | √ | √ | √ |
hash | √ | √ | √ |
range | √ | √ | √ |
当前我们已经兼容Oracle复合分区 range+list, range+hash,为进一步提升兼容能力,LightDB自23.3起新增加了list+hash的支持。
至此LightDB对复合分区的支持如下:
list | hash | range | |
list | × | √ | × |
hash | × | × | × |
range | √ | √ | × |
支持的版本:list+hash 自LightDB 23.3
代码案例:
下面将以list+hash基础示例进行说明:
1,创建并插入数据 (请注意:此为oracle模式特有功能,因此需要在创建数据库时指定oracle模式)
create database oradb_test_list_hash with lightdb_syntax_compatible_type 'oracle'; \c oradb_test_list_hash; -- create without hash subpartitions count create table LH(a int, b int) partition by list(a) subpartition by hash(b) ( partition l_1 values(1), partition l_2 values(2) ); insert into LH(a,b) values(1,1); insert into LH(a,b) values(1,2); insert into LH(a,b) values(2,1); insert into LH(a,b) values(2,2);
2,查询,以及truncate 分区后,再次查询
dev@oradb_test_list_hash=# select * from lh;
a | b
---+---
1 | 1
1 | 2
2 | 1
2 | 2
(4 rows)
dev@oradb_test_list_hash=# ALTER TABLE LH truncate partition l_1;
ALTER TABLE
dev@oradb_test_list_hash=# select * from lh;
a | b
---+---
2 | 1
2 | 2
(2 rows)
3,其它创建方式
-- list hash with subpartitions count create table LH(a int, b int) partition by list(a) subpartition by hash(b) subpartitions 4 ( partition l_1 values(1), partition l_2 values(2) ); -- list hash with template create table LH(a int, b int) partition by list(a) subpartition by hash(b) subpartition template ( subpartition h_0, subpartition h_1 ) ( partition l_1 values(1), partition l_2 values(2) );
注意:
1,添加分区的时候,子分区并不会自动被创建。
Oracle分区其它文章请参考:
[LightDB兼容增强]支持Oracle PARTITION - aodb - 博客园 (cnblogs.com)
[LightDB兼容增强]支持 Oracle list default 分区 - aodb - 博客园 (cnblogs.com)