[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)

  

 

 

posted on 2023-08-01 14:03  aodb  阅读(73)  评论(0编辑  收藏  举报