关键字:
分区表
分区表概述
分区表就是根据分区策略,将数据分散到不同的子表中,并通过父表建立关联关系,从而实现数据物理上的分区。在KingbaseES数据库中,分区能够将大表和索引分解成更小、更易于管理子分区。每个分区是一个独立的对象,具有其自己的名称和存储特征。
分区的好处
(1)、在某些情况下查询性能能够显著提升,特别是当那些访问压力大的行在一个分区或者少数几个分区时。划分可以取代索引的主导列、减小索引尺寸以及使索引中访问压力大的部分更有可能被放在内存中。
(2)、当查询或更新访问一个分区的大部分行时,可以通过该分区上的一个顺序扫描来取代分散到整个表上的索引和随机访问,这样可以改善性能。
(3)、分区表具有多个分片,可以将其作为一个整体来管理,也可以单独管理各个分片。
DDL 语句可以单独处理分区,而不是整个表或索引。因此,您可以分解大量占用资源的任务,如重建索引或表。例如,您可以一次只修改一个表分区。如果发生了问题,则只需重新修改该分区,而不是整个表。而且,删除一个分区可以避免执行许多 DELETE语句。
常用分区类型
(1)、范围分区:表被根据一个关键列或一组列划分为范围,不同的分区范围之间没有重叠。
(2)、列表分区:通过显示地列出每一个分区中出现的键值来划分。
(3)、哈希分区:通过为每个分区指定模数和余数来对表进行分区。
分区表使用
4.1 范围分区
CREATE TABLE student_range
(
sno NUMERIC(4,0),
sname CHARACTER VARYING(20 char),
gender CHARACTER VARYING(20 char),
birthday date,
address CHARACTER VARYING(128 char)
) PARTITION BY RANGE (birthday);
CREATE TABLE student_range1 PARTITION OF student_range FOR VALUES FROM ('2024-01-01') TO ('2024-03-01');
CREATE TABLE student_range2 PARTITION OF student_range FOR VALUES FROM ('2024-03-02') TO ('2024-05-01');
CREATE TABLE student_range3 PARTITION OF student_range FOR VALUES FROM ('2024-05-02') TO ('2024-07-01');
CREATE TABLE student_range4 PARTITION OF student_range FOR VALUES FROM ('2024-07-02') TO ('2024-09-01');
CREATE TABLE student_range5 PARTITION OF student_range FOR VALUES FROM ('2024-09-02') TO ('2024-11-01');
CREATE TABLE student_range6 PARTITION OF student_range FOR VALUES FROM ('2024-11-02') TO ('2025-01-01');
INSERT INTO student_range values(1,'tom',1,'2024-04-25','tianjin');
查看执行计划:
EXPLAIN SELECT * FROM student_range;
EXPLAIN SELECT * FROM student_range WHERE birthday BETWEEN '2024-03-30' AND '2024-04-30';
4.2 列表分区
CREATE TABLE student_list
(
sno NUMERIC(4,0),
sname CHARACTER VARYING(20 char),
gender CHARACTER VARYING(20 char),
birthday date,
address CHARACTER VARYING(128 char)
) PARTITION BY LIST (address);
CREATE TABLE student_list1 PARTITION OF student_list FOR VALUES IN ('tianjin');
CREATE TABLE student_list2 PARTITION OF student_list FOR VALUES IN ('beijing');
CREATE TABLE student_list3 PARTITION OF student_list FOR VALUES IN ('shanghai');
CREATE TABLE student_list4 PARTITION OF student_list FOR VALUES IN ('chongqin');
INSERT INTO student_list values(1,'tom',1,'2024-04-25','tianjin');
查看执行计划:
EXPLAIN SELECT * FROM student_list;
EXPLAIN SELECT * FROM student_list WHERE address = 'tianjin';
4.3 哈希分区
CREATE TABLE student_hash
(
sno NUMERIC(4,0),
sname CHARACTER VARYING(20 char),
gender CHARACTER VARYING(20 char),
birthday date,
address CHARACTER VARYING(128 char)
) PARTITION BY HASH (sno);
CREATE TABLE student_hash1 PARTITION OF student_hash FOR VALUES WITH (MODULUS 4, REMAINDER 0);
CREATE TABLE student_hash2 PARTITION OF student_hash FOR VALUES WITH (MODULUS 4, REMAINDER 1);
CREATE TABLE student_hash3 PARTITION OF student_hash FOR VALUES WITH (MODULUS 4, REMAINDER 2);
CREATE TABLE student_hash4 PARTITION OF student_hash FOR VALUES WITH (MODULUS 4, REMAINDER 3);
INSERT INTO student_hash values(1,'tom1',1,'2024-04-25','tianjin');
INSERT INTO student_hash values(2,'tom2',1,'2024-04-25','tianjin');
INSERT INTO student_hash values(3,'tom3',1,'2024-04-25','tianjin');
INSERT INTO student_hash values(4,'tom4',1,'2024-04-25','tianjin');
查看执行计划:
EXPLAIN SELECT * FROM student_hash;
EXPLAIN SELECT * FROM student_hash WHERE sno = 2;