达梦分布式集群DPC_表分区方式详细介绍
- 1 范围分区
- 1.1 建表语句示例
- 1.2 优劣势分析
- 2 间隔分区
- 2.1 建表语句示例
- 2.2 优劣势
- 3 HASH分区
- 3.1 建表示例
- 3.2 优劣势分析
- 4 列表分区
- 4.1 建表示例
- 4.2 优劣势分析
- 5 以上分区组成的复合分区
- 5.1 建表示例
- 5.2 优劣势分析
- 6 分区方式适合场景
1 范围分区
根据分区键的取值范围来划分分区
1.1 建表语句示例
最常见的以时间划分
例如
--建表语句为
CREATE TABLE TEST01
(
"ID" VARCHAR2(36) NOT NULL,
"DATE" TIMESTAMP(0) NOT NULL
)PARTITION BY RANGE("DATE")
(
PARTITION P201001 VALUES LESS THAN(DATETIME'2010-01-01 00:00:00'),
PARTITION P201501 VALUES LESS THAN(DATETIME'2015-01-01 00:00:00'),
PARTITION P202001 VALUES LESS THAN(DATETIME'2020-01-01 00:00:00'),
PARTITION P202501 VALUES LESS THAN(DATETIME'2025-01-01 00:00:00'),
PARTITION "PMAX" VALUES LESS THAN(MAXVALUE));--分析
语句以DATE列作为分区键,创建了总共5个子表的分区表;
小于'2010-01-01 00:00:00'的值,存储在P201001分区中,大于等于'2025-01-01 00:00:00'的值统一存储在PMAX分区中;
1.2 优劣势分析
优点
1.对于按范围查询的场景,如查询某一年度、某月数据,数据库能够快速定位到对应的分区,避免全表扫描,极大提升查询性能。
2.同时也方便分区管理,比如处理某个年月数据,只需要针对对应的分区进行处理即可。
3.插入性能远优于间隔分区。(间隔分区每插入一行数据,数据库内部都会判断)
缺点
1.需要预先定义分区范围,不适合动态变化的分区键。
2.在需要创建特别多分区的场景,比如以 “天” 来划分分区,DDL语句会特别慢,因为每个子表都会操作DDL,如果一个总表有1w个子表,那要操作1w次DDL语句;
3.如果分区键的值分布不均匀,可能导致某些分区数据量过大,影响查询性能。
2 间隔分区
间隔分区是特殊得范围分区,也以时间列作为分区键为例
2.1 建表语句示例
--建表语句
CREATE TABLE TEST01
(
"ID" VARCHAR2(36) NOT NULL,
"DATE" TIMESTAMP(0) NOT NULL
)PARTITION BY RANGE("DATE")
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))
(
PARTITION P202409 VALUES LESS THAN(DATETIME'2024-09-01 00:00:00'),
PARTITION P202410 VALUES LESS THAN(DATETIME'2024-10-01 00:00:00'),
PARTITION P202411 VALUES LESS THAN(DATETIME'2024-11-01 00:00:00'),
PARTITION P202412 VALUES LESS THAN(DATETIME'2024-12-01 00:00:00'),
PARTITION P202501 VALUES LESS THAN(DATETIME'2025-01-01 00:00:00'),
PARTITION P202502 VALUES LESS THAN(DATETIME'2025-02-01 00:00:00')
);--分析
语句也以DATE列作为分区键,手动创建了6个子表的间隔分区表;
小于'2024-09-01 00:00:00'的值,存储在P202409分区中,超过或者等于'2025-01-01 00:00:00'的值,间隔分区会进行判断后,以月为间隔单位,新建一个子表;比如插入数据'2025-02-01 00:00:00',就会新建一个
PARTITION "分区子表名" VALUES LESS THAN(DATETIME'2025-03-01 00:00:00')子表
2.2 优劣势
优点
1.更方便管理,不用手动创建多个分区,属于哪个分区是数据库内部自动创建;
2.子表数少于范围分区,DDL效率会更佳;
缺点
1.不适合insert和update多的场景,每插入一条数据,内部都会判断数据属于哪个分区,是否需要新增分区,插入和更新效率会特别慢;
3 HASH分区
哈希分区是根据哈希函数的结果进行分区,确保数据均匀分布。
3.1 建表示例
CREATE TABLE TEST (ID INT,NAME INT
)
PARTITION BY HASH (ID)
PARTITIONS 4;--分析
创建一个4个子表的HASH分区表,分区键为ID列
3.2 优劣势分析
优势:
1.数据分布均匀,适合需要负载均衡的场景。
劣势:
1.无法利用分区裁剪,每个操作只能全表扫,查询性能可能不如范围分区或列表分区,数据量很大后,会造成资源浪费。
2.分区数量固定,调整分区数量需要重新分布数据。
最常用的是HASH(主键列)
4 列表分区
列表分区是根据某个离散值列表进行分区。
4.1 建表示例
按地区列表分区的表创建示例:
CREATE TABLE orders (order_id INT,region VARCHAR(50),order_date DATE,amount DECIMAL(10, 2)
)
PARTITION BY LIST (region) (PARTITION p_east VALUES IN ('Beijing', 'Shanghai', 'Guangzhou'),PARTITION p_west VALUES IN ('Chengdu', 'Chongqing', 'Xian'),PARTITION p_north VALUES IN ('Shenyang', 'Harbin', 'Changchun')
);
4.2 优劣势分析
跟范围分区类似
优势:
1.适用于按离散值查询的场景,能够快速定位到特定分区。
2.灵活性高,可以根据业务需求动态调整分区列表。
劣势:
1.如果分区键的值过多,可能导致分区数量过多,增加管理复杂度。
2.不适合分区键值频繁变化的场景。
5 以上分区组成的复合分区
复合分区是结合多种分区策略的分区方式。
5.1 建表示例
CREATE TABLE TEST
(
"ID" VARCHAR2(100),
"DATE_01" TIMESTAMP(0))
PARTITION BY RANGE("DATE_01")
SUBPARTITION BY HASH("ID") SUBPARTITION TEMPLATE
SUBPARTITIONS 10
(
PARTITION P01 VALUES LESS THAN(DATETIME'2024-11-01 00:00:00'),
PARTITION P02 VALUES LESS THAN(DATETIME'2024-12-01 00:00:00'),
PARTITION P03 VALUES LESS THAN(DATETIME'2025-01-01 00:00:00'),
PARTITION "PMAX" VALUES LESS THAN(MAXVALUE));--分析
sql创建一个范围+HASH的二级分区表
每个范围下分成10个子表,避免了先范围分区后,数据分布不均匀的情况
5.2 优劣势分析
优势:
1.灵活性高,可以结合多种分区策略的优点。
2.适用于复杂业务场景,能够精细化管理数据。
劣势:
1.设计和管理复杂度较高。
2.分区数量可能非常多,增加元数据管理开销,DDL语句也会慢。
6 分区方式适合场景
下一篇:
达梦分布式集群DPC_表分区最佳实践_yxy
更多其他数据库相关专栏:
数据库性能优化(sql优化)_基本思路_yxy
数据库性能优化(sql优化)_索引详解01_yxy(共4篇)
数据库性能优化(sql优化)_SQL执行计划01_yxy(共3篇)
数据库性能优化(sql优化)_统计信息_yxy