分区表是将表中的数据按照一定的规则分割成多个独立的部分(分区),每个分区可以独立存储和管理,支持范围、哈希、列表和组合分区等多种分区方式
当表未进行分区时,随着表中的数据量不断的增加,查询数据的速度自然就会变慢,应用程序的性能也就会下降。当将表进行分区时,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个物理文件上,这样在查询数据时,不至于每次都扫描整张表而只是从当前的分区查到所要的数据,大大提高了数据查询的速度。
范围分区是一种按照某个列的值的范围来创建分区的方式。当用户向表中写入数据时,数据库服务器将按照这些列上的值进行判断,将数据写入相应的分区中。分区列一般为数字或者是日期时间类型
CREATE TABLE "TEST"."t_range"
(
"ID" INT,
"NAME" VARCHAR(50))
PARTITION BY RANGE("id")
(
PARTITION "p1" VALUES LESS THAN(1000) STORAGE(ON "tbs1", CLUSTERBTR) ,
PARTITION "p2" VALUES LESS THAN(2000) STORAGE(ON "tbs2", CLUSTERBTR) ,
PARTITION "p3" VALUES LESS THAN(3000) STORAGE(ON "tbs3", CLUSTERBTR)
) STORAGE(ON "test", CLUSTERBTR) ;
BEGIN
for i in 1..2999 LOOP
insert into t_range values(i,'AAA'||i);
end LOOP;
commit;
end;
列表分区是通过指定表中的某个列的离散值集来确定应当存储在一起的数据。当某个列上的数据无法通过划分范围的方法进行分区,并且该列上的数据是相对固定的一些值时,可以考虑使用列表分区。一般来说,对于字符型数据,取值比较固定的,则适合于采用列表分区的方法。
CREATE TABLE "TEST"."t_list"
(
"ID" INT,
"NAME" VARCHAR(20),
"CITY" VARCHAR(10))
PARTITION BY LIST("CITY")
(
PARTITION "p1" VALUES('北京'),
PARTITION "p2" VALUES('上海','南京','杭州'),
PARTITION "p3" VALUES('武汉','长沙'),
PARTITION "p4" VALUES('广州','深圳')
) STORAGE(ON "test", CLUSTERBTR) ;
insert into t_list values(1,'AAA01','北京');
insert into t_list values(2,'AAA02','上海');
insert into t_list values(3,'AAA03','南京');
insert into t_list values(4,'AAA04','杭州');
insert into t_list values(5,'AAA05','武汉');
insert into t_list values(6,'AAA06','长沙');
insert into t_list values(7,'AAA07','广州');
insert into t_list values(8,'AAA08','深圳');
哈希分区是一种通过指定分区编号来均匀分布数据的分区方式。它通过在 I/O 设备上进行散列分区,使得这些分区大小基本一致。哈希分区的目的是将数据均匀地分布到各个分区中,以平衡各个分区的数据量和 I/O 负载。
哈希分区适用于数据分布比较均匀、无法预测某个列上的数据变化范围、大规模数据存储和高并发数据访问的场景等
create table "TEST"."t_hash"
(
"ID" INT,
"NAME" VARCHAR(30)
)
PARTITION BY HASH ("ID")
(
PARTITION "p1",
PARTITION "p2",
PARTITION "p3"
);
BEGIN
for i in 1..500 LOOP
insert into t_hash values(i,'AAA'||i);
end LOOP;
commit;
end;
组合分区是将范围分区、哈希分区或列表分区中的两种或多种分区方法进行组合,形成多级分区结构。达梦数据库支持最多八层的多级分区;
当单一的分区方式无法满足需求时,可以尝试采用组合分区的方式进行处理
CREATE TABLE "TEST"."t_range_list"
(
"ID" INT,
"NAME" CHAR(10),
"DATE" DATETIME(0),
"CITY" VARCHAR(30))
PARTITION BY RANGE("DATE")
SUBPARTITION BY LIST("CITY") SUBPARTITION TEMPLATE
(
SUBPARTITION "p1" VALUES('北京') STORAGE(ON "test"),
SUBPARTITION "p2" VALUES('上海') STORAGE(ON "test"),
SUBPARTITION "p3" VALUES('武汉') STORAGE(ON "test")
)
(
PARTITION "p1" VALUES LESS THAN(DATETIME'2011-01-01 00:00:00') STORAGE(ON "test", CLUSTERBTR) ,
PARTITION "p2" VALUES LESS THAN(DATETIME'2016-01-01 00:00:00') STORAGE(ON "test", CLUSTERBTR) ,
PARTITION "p3" VALUES LESS THAN(DATETIME'2021-01-01 00:00:00') STORAGE(ON "test", CLUSTERBTR)
) STORAGE(HASHPARTMAP(1), ON "test", CLUSTERBTR) ;
insert into "t_range_list" values(1,'AAA01','2007-01-08','北京');
insert into "t_range_list" values(2,'AAA02','2013-07-05','上海');
insert into "t_range_list" values(3,'AAA03','2018-02-10','武汉');
insert into "t_range_list" values(4,'AAA04','2008-01-08','北京');
insert into "t_range_list" values(5,'AAA05','2014-03-06','上海');
insert into "t_range_list" values(6,'AAA06','2019-03-06','武汉');
1、查看数据库有哪些分区表:
select
TABLE_NAME,TABLESPACE_NAME,PARTITIONED
from
SYS.USER_TABLES where PARTITIONED='YES';
2、查看分区表的分区信息:
select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME,HIGH_VALUE
from SYS.USER_TAB_PARTITIONS where TABLE_NAME='t_range';
3、删除某个分区:
alter table t_range drop PARTITION t_range_p1;
4、增加分区:
alter table t_range ADD PARTITION t_range_pm
values(DEFAULT);
5、合并分区:
alter table t_range MERGE PARTITIONS p1,p2 into PARTITION p1_2;
6、拆分分区:
alter table t_range SPLIT PARTITION p1_2 at (1000) into (PARTITION
p1,PARTITION p2);
文章
阅读量
获赞