侧边栏壁纸
  • 累计撰写 89 篇文章
  • 累计创建 17 个标签
  • 累计收到 23 条评论

目 录CONTENT

文章目录

postgresql分区表创建

Administrator
2025-01-06 / 0 评论 / 0 点赞 / 38 阅读 / 0 字

一:分区表的定义和优点

1分区表的定义

分区表就是根据分区策略,将数据数据分散到不同的子表中,并通过父表建立关联关系,从而实现数据物理上的分区。分区表在物理上是分开存储的,但在逻辑上仍作为一个整体呈现给用户。这一特性特别适用于处理大量数据的场景,旨在提高查询性能、管理和维护大数据集的效率。

2分区表的优点

  • 查询性能提升:通过将数据分布到多个分区,查询可以针对单个分区进行,而不是整个表,从而减少需要扫描的数据量,提高查询性能。

  • 方便管理:维护数据更方便快捷,不用整个表都维护,只需要单独维护某个分区,对某个分区进行增删改查等操作。

  • 数据隔离:在实际业务场景下,有些时候要对数据进行逻辑上的隔离,分区表刚好能够满足这一业务需求。

  • 提高并发性:分区表可以提高并发性,因为不同的查询可以并行地访问不同的分区,减少了锁的争用。

二:分区表的类型

PostgreSQL支持三种主要的分区类型:范围分区(Range Partitioning)、列表分区(List Partitioning)和哈希分区(Hash Partitioning)。

1:范围分区(Range Partitioning):根据表中某一列的值范围来创建分区。例如,可以根据时列将数据按月、季度或年份划分到不同的分区中。

2:列表分区(List Partitioning):根据列的特定值列表来划分分区。适合于当数据可以明确地根据某个列的枚举值进行分类的情况,如按地区或用户组划分。

3:哈希分区(Hash Partitioning):从PostgreSQL 11版本开始支持。基于哈希算法将数据分布到不同分区中,适用于希望数据均匀分布在各个分区的场景,但不保证数据的顺序或范围。

三:在Postgresql中创建范围分区表

1:创建父表,所有子表继承该表,一般父表不存储数据,也不需要在父表中建立索引,该表包含所有分区表的共同字段,并且不包含任何数据。父表需要指定分区键和分区类型。

在创建父表的时候遇到了一个报错,我们一起来看一下是为什么?

--创建父表

CREATE TABLE father_table (

    id SERIAL,

    column1 TEXT,

    column2 INTEGER,

    partition_key INT,

		primary key (id,partition_key)

) PARTITION BY RANGE (partition_key);

2:创建分区表,分区表需要创建多个,我们是按照范围分区,分区表的继承分区父表的所有属性,包括(字段个数,类型,索引,主键)另外,分区表还需要指定分区健的值的范围。

分区表的创建如下所示

--创建分区表
CREATE TABLE child_table1 PARTITION OF father_table
FOR VALUES FROM (1) TO (100);
 
CREATE TABLE child_table2 PARTITION OF father_table
FOR VALUES FROM (101) TO (200);
 
CREATE TABLE child_table3 PARTITION OF father_table
FOR VALUES FROM (201) TO (300);
 
CREATE TABLE child_table4 PARTITION OF father_table
FOR VALUES FROM (301) TO (400);

 3:不用指定分区表名,直接给表中插入数据,数据库会自动根据分区的范围插入数据到不同的分区表中。

--插入数据
INSERT INTO father_table (column1, column2, partition_key) VALUES ('value1', 1, 50);
INSERT INTO father_table (column1, column2, partition_key) VALUES ('value1', 2, 150);
INSERT INTO father_table (column1, column2, partition_key) VALUES ('value1', 3, 250);
INSERT INTO father_table (column1, column2, partition_key) VALUES ('value1', 4, 350);

表数据

四:在Postgresql中创建列表分区表

创建学生表,需要根据学生籍贯来进行分区

--创建学生表,按照籍贯分区(列表分区例子)
CREATE TABLE students (
    student_id SERIAL ,
    name VARCHAR(100),
    province VARCHAR(50),
		PRIMARY KEY(student_id,province)  --键约束或唯一约束必须包含所有分区字段
) PARTITION BY LIST (province);
--分区表
CREATE TABLE student1 PARTITION OF students
FOR VALUES IN ('shanxi');
CREATE TABLE student2 PARTITION OF students
FOR VALUES IN ('henan');
CREATE TABLE student3 PARTITION OF students
FOR VALUES IN ('gansu');
CREATE TABLE student4 PARTITION OF students
FOR VALUES IN ('beijing');
CREATE TABLE student5 PARTITION OF students
FOR VALUES IN ('shanghai');
CREATE TABLE student6 PARTITION OF students
FOR VALUES IN ('guangzhou');
-- 插入数据
INSERT INTO students (name, province) VALUES ('小明', 'shanxi');
INSERT INTO students (name, province) VALUES ('小李', 'henan');
INSERT INTO students (name, province) VALUES ('小王', 'gansu');
INSERT INTO students (name, province) VALUES ('小刚', 'beijing');
INSERT INTO students (name, province) VALUES ('小红', 'shanghai');
INSERT INTO students (name, province) VALUES ('小杨', 'guangzhou');
 
 
-- 查询数据
SELECT * FROM students WHERE province in('shanxi','henan','gansu','beijing','shanghai','guangzhou') ;

五:在Postgresql中创建哈希分区表

哈希分区表的优点如下

  1. 数据分布:哈希分区可以将数据均匀地分布到多个分区中,从而提高查询和事务的并行处理能力。

  2. 性能优化:通过将大表分割成小的分区,可以显著减少查询处理的数据量,从而提高查询效率。

  3. 管理便捷:分区表可以作为管理大量数据的手段,使得数据的维护和管理更加简单。

以下是一个创建哈希分区表的示例代码:

--创建哈希分区表
CREATE TABLE measurement (
    city_id         int not null,
    logdate         date not null,
    peaktemp        int,
    unitsales       int
) PARTITION BY HASH (city_id);
 
CREATE TABLE measurement_p1 PARTITION OF measurement
    FOR VALUES WITH (MODULUS 5, REMAINDER 1);
 
CREATE TABLE measurement_p2 PARTITION OF measurement
    FOR VALUES WITH (MODULUS 5, REMAINDER 2);
 
CREATE TABLE measurement_p3 PARTITION OF measurement
    FOR VALUES WITH (MODULUS 5, REMAINDER 3);
 
CREATE TABLE measurement_p4 PARTITION OF measurement
    FOR VALUES WITH (MODULUS 5, REMAINDER 4);
 
CREATE TABLE measurement_p5 PARTITION OF measurement
    FOR VALUES WITH (MODULUS 5, REMAINDER 0);

目录

一:分区表的定义和优点

1分区表的定义

2分区表的优点

二:分区表的类型

三:在Postgresql中创建范围分区表

四:在Postgresql中创建列表分区表

五:在Postgresql中创建哈希分区表

	--插入数据
		INSERT INTO measurement (city_id, logdate,peaktemp,unitsales) VALUES (10, now(),2,3);
		INSERT INTO measurement (city_id, logdate,peaktemp,unitsales) VALUES (13, now(),2,3);
		INSERT INTO measurement (city_id, logdate,peaktemp,unitsales) VALUES (17, now(),2,3);
		INSERT INTO measurement (city_id, logdate,peaktemp,unitsales) VALUES (18, now(),2,3);

0

评论区