注册
分区表之学习总结
专栏/培训园地/ 文章详情 /

分区表之学习总结

mttt 2025/04/09 193 0 0
摘要

概念:

分区表是将表中的数据按照一定的规则分割成多个独立的部分(分区),每个分区可以独立存储和管理,支持范围、哈希、列表和组合分区等多种分区方式
当表未进行分区时,随着表中的数据量不断的增加,查询数据的速度自然就会变慢,应用程序的性能也就会下降。当将表进行分区时,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个物理文件上,这样在查询数据时,不至于每次都扫描整张表而只是从当前的分区查到所要的数据,大大提高了数据查询的速度。

优点主要包括:

  • 提高查询性能:查询时只需访问相关分区,减少I/O操作,加快查询速度。
  • 增强数据管理的灵活性:分区表的数据分散存储,便于按分区进行加载、删除等操作。
  • 提高可用性:一个分区损坏不影响其他分区,减少数据损坏风险。
  • 均衡I/O负载:数据分布在不同磁盘上,可平衡I/O操作,提升系统性能。
  • 便于维护和备份:可针对特定分区进行维护、备份和恢复操作,节省时间和资源。

范围分区:

范围分区是一种按照某个列的值的范围来创建分区的方式。当用户向表中写入数据时,数据库服务器将按照这些列上的值进行判断,将数据写入相应的分区中。分区列一般为数字或者是日期时间类型

sql实现:

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

管理工具实现:

image.png
image.png

插入数据:

BEGIN
for i in 1..2999 LOOP
insert into t_range values(i,'AAA'||i);
end LOOP;
commit;
end;

结果显示:

image.png

列表分区:

列表分区是通过指定表中的某个列的离散值集来确定应当存储在一起的数据。当某个列上的数据无法通过划分范围的方法进行分区,并且该列上的数据是相对固定的一些值时,可以考虑使用列表分区。一般来说,对于字符型数据,取值比较固定的,则适合于采用列表分区的方法。

sql实现:

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

管理工具实现:

image.png
image.png

插入数据:

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','深圳');

结果显示:

image.png

哈希分区:

哈希分区是一种通过指定分区编号来均匀分布数据的分区方式。它通过在 I/O 设备上进行散列分区,使得这些分区大小基本一致。哈希分区的目的是将数据均匀地分布到各个分区中,以平衡各个分区的数据量和 I/O 负载。
哈希分区适用于数据分布比较均匀、无法预测某个列上的数据变化范围、大规模数据存储和高并发数据访问的场景等

sql实现:

create table "TEST"."t_hash"
(
"ID" INT,
"NAME" VARCHAR(30)
)
PARTITION BY HASH ("ID") 
(
PARTITION "p1", 
PARTITION "p2", 
PARTITION "p3"
);

管理工具实现:

image.png
image.png

插入数据:

BEGIN
for i in 1..500 LOOP
insert into t_hash values(i,'AAA'||i);
end LOOP;
commit;
end;

结果显示:

image.png

组合分区:

组合分区是将范围分区、哈希分区或列表分区中的两种或多种分区方法进行组合,形成多级分区结构。达梦数据库支持最多八层的多级分区;
当单一的分区方式无法满足需求时,可以尝试采用组合分区的方式进行处理

sql实现:

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

管理工具实现:

image.png
image.png
image.png

插入数据:

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','武汉');

结果显示:

image.png

分区表维护相关操作:

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);
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服