DM8 达梦数据库 分区表介绍
DM8支持的分区表类型
达梦 dm8 支持的水平分区类型:
范围分区(range),
列表分区(list),
哈希分区(hash),
间隔分区(range 分区的一种)
这几种。
下面分别介绍
范围分区(range)
范围分区的字段是数字或日期时间类型。
例如创建下面的表:
create table T_P1
(
id int,
name varchar(30)
)
partition by range (id)
(
partition p1 values less than (100),
partition p2 values less than(200),
partition p3 values less than(400)
);
执行sql查询 数据库有哪些分区表(需要有相关权限)
select table_name,partitioned from dba_tables where
partitioned='YES';
然后我们插入3条测试数据
insert into T_P1 values(100-1,'a');
insert into T_P1 values(200-1,'a');
insert into T_P1 values(400-1,'a');
commit;
查分区表某个分区的记录,一下2句sql是等效的。
select * from T_P1_p1;
select * from T_P1 partition(p1);
类似的:
select * from T_P1_p2;
select * from T_P1 partition(p2);
select * from T_P1_p3;
select * from T_P1 partition(p3);
我们还可以将每个分区映射到不同表空间中
create tablespace "TBS1" datafile '/dm8/data/DMDB/TBS101.DBF' size 32 CACHE = NORMAL;
create tablespace "TBS2" datafile '/dm8/data/DMDB/TBS102.DBF' size 32 CACHE = NORMAL;
create tablespace "TBS3" datafile '/dm8/data/DMDB/TBS103.DBF' size 32 CACHE = NORMAL;
再创建一个分区表,把分区指定到新创建的表空间。
CREATE TABLE T_p2
(
ID INT,
PID INT,
NAME VARCHAR(30)
)
PARTITION BY RANGE(ID)
(
PARTITION P1 VALUES LESS THAN(100) TABLESPACE TBS1,
PARTITION P2 VALUES LESS THAN(200) TABLESPACE TBS2,
PARTITION P3 VALUES LESS THAN(400) TABLESPACE TBS3,
PARTITION PM VALUES LESS THAN (MAXVALUE)
);
其中 :
PARTITION PM VALUES LESS THAN (MAXVALUE)
会容纳 id >=400 的数据,不然会报错 :没有找到合适的分区
列表分区
列表分区适合字符串类型
创建表:
create table t_sales
(
sales_id int,
saleman varchar(30),
saledate datetime,
city varchar(30)
)
partition by LIST (CITY)
(
PARTITION P1 VALUES ('北京','天津','石家庄'),
PARTITION P2 VALUES ('上海','南京' ),
PARTITION P3 VALUES ('武汉','长沙','南昌' ),
PARTITION P4 VALUES ('广州','深圳','东莞' ),
PARTITION pm values (default)
);
其中 PARTITION pm values (default) 会存放city不属于 ‘北京’,‘天津’,‘石家庄’,‘上海’,‘南京’,‘武汉’,‘长沙’,‘南昌’,‘广州’,‘深圳’,‘东莞’ 的数据。
插入5行测试数据
INSERT INTO T_SALES VALUES(1,'AAA','2012-01-01','石家庄');
INSERT INTO T_SALES VALUES(1,'ADD','2013-01-01','上海' );
INSERT INTO T_SALES VALUES(2,'DDD','2021-01-01','武汉' );
INSERT INTO T_SALES VALUES(2,'DDD','2021-01-01','广州' );
INSERT INTO T_SALES VALUES(2,'DDD','2021-01-01','汕头' );
commit;
然后查询验证一下:
select *,'p1' partition_ from T_SALES partition(p1) union
select *,'p2' partition_ from T_SALES partition(p2) union
select *,'p3' partition_ from T_SALES partition(p3) union
select *,'p4' partition_ from T_SALES partition(p4) union
select *,'pm' partition_ from T_SALES partition(pm)
哈希分区
存数据非常快,取数据比较慢,各个子分区的数据都是被平均分配如果hash 分区不指定分区名,就通过指定的hash 的分区数来创建,子分区名统一使用DMHASHPRT+分区号(从0 开始)作为分区名。
创建表,对id 字段分区:
create table t_hash
(
id int,
name varchar(30)
)
partition by hash(id) PARTITIONS 5;
其中 partition by hash(id) PARTITIONS 5; 的5 代表划分为5个分区。
插入测试数据:
declare
begin
for i in 1..3000 LOOP
insert into t_hash values(i,'AAA');
END LOOP;
COMMIT;
END;
验证数据:
SELECT *,'p_hash_0' partition_ FROM T_HASH_DMHASHPART0 where rownum<2 union
SELECT *,'p_hash_1' partition_ FROM T_HASH_DMHASHPART1 where rownum<2 union
SELECT *,'p_hash_2' partition_ FROM T_HASH_DMHASHPART2 where rownum<2 union
SELECT *,'p_hash_3' partition_ FROM T_HASH_DMHASHPART3 where rownum<2 union
SELECT *,'p_hash_4' partition_ FROM T_HASH_DMHASHPART4 where rownum<2;
间隔分区 Numtoyminterval
实际上是范围分区的一个扩展
create table interval_sales
(
prod_id number(6),
time_id date
)
partition by range (time_id)
INTERVAL(
NUMTOYMINTERVAL(1, 'MONTH')
)--------可以是MONTH,YEAR,DAY
(
partition p1 values less than (
to_date('2015-01-01','yyyy-mm-dd')
)
);
用时间间隔函数做分区,数据插入时,没有对应的分区,数据库会自动给你创建一个新分区。
插入测试数据
insert into interval_sales values(001,to_date('2015-02-01','yyyy-mm-dd')-100);
insert into interval_sales values(002,to_date('2015-02-01','yyyy-mm-dd'));
commit;
查一下 interval_sales 表拥有那些分区
select table_name,partition_name from user_tab_partitions where table_name='INTERVAL_SALES';
验证
select *,'p1' partition_ from INTERVAL_SALES partition(p1) union
select *,'SYS_P1354_1356' partition_ from INTERVAL_SALES partition(SYS_P1354_1356) ;