暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据库模型设计案例分享(GaussDB版)(下)

3246 2023-10-30
117

四、GaussDB分区表管理(示例)

示例一:创建范围分区表(RANGE)

范围分区表:将数据基于范围映射到每一个分区,这个范围是由创建分区表时指定的分区键决定的。这种分区方式是最为常用的,并且分区键经常采用日期,例如将销售数据按照月份进行分区。


1、创建一个按年份分区的订单表:

--创建范围分区表(RANGE)

DROP TABLE orders_1;

CREATE TABLE orders_1 (

id INT PRIMARY KEY,

order_date CHAR(4) ,

customer_id INT,

product_name VARCHAR(255)

) PARTITION BY RANGE (order_date)

( PARTITION p1 VALUES LESS THAN (2021),

PARTITION p2 VALUES LESS THAN (2022),

PARTITION p3 VALUES LESS THAN (2023),

PARTITION P4 VALUES LESS THAN(MAXVALUE));
--查看创建的分区表信息

select relname,parttype,parentid,boundaries from pg_partition where parentid in (SELECT parentid FROM pg_partition where relname='orders_1');


2、写入测试数据并访问

--插入测试数据

INSERT INTO orders_1(id,order_date,customer_id,product_name)VALUES(1001,'2021',100,'商品A');

INSERT INTO orders_1(id,order_date,customer_id,product_name)VALUES(1002,'2022',200,'商品B');

INSERT INTO orders_1(id,order_date,customer_id,product_name)VALUES(1003,'2023',300,'商品C');
--访问分区表:

-- 只查询2020年的数据

SELECT * FROM orders_1 WHERE order_date = 2021;
-- 查询2020年至2022年的数据

SELECT * FROM orders_1 WHERE order_date BETWEEN 2021 AND 2022;
-- 只查询2020年之后的数据(超出范围的数据将被过滤掉)

SELECT * FROM orders_1 WHERE order_date >= 2021;

3、删除/增加/修改

--DROP

ALTER TABLE orders_1 DROP PARTITION P5;
--ADD

ALTER TABLE orders_1 ADD PARTITION P4 VALUES LESS THAN (2024);

ALTER TABLE orders_1 ADD PARTITION P6 VALUES LESS THAN (2025);

ALTER TABLE orders_1 ADD PARTITION P10 VALUES LESS THAN (MAXVALUE);
--RENAME

ALTER TABLE orders_1 RENAME PARTITION P10 TO P5;
--查看创建的分区表信息

select relname,parttype,parentid,boundaries from pg_partition where parentid in (SELECT parentid FROM pg_partition where relname='orders_1') ;

示例二:创建哈希分区表(HASH)

哈希分区表:将数据根据内部哈希算法依次映射到每一个分区中,包含的分区个数由创建分区表时指定。


1、假设我们有一个名为orders_2的大表,包含id(订单ID)、customer_id(客户ID)、order_date(订单日期)等字段。现在我们需要根据customer_id进行分区,以便更好地管理和查询这些数据。

--创建哈希分区表(HASH)

drop TABLE orders_2;

CREATE TABLE orders_2 (

id INT PRIMARY KEY,

customer_id INT,

order_date DATE

) PARTITION BY HASH (customer_id)

( partition p1,

partition p2 );
--查看创建的分区表信息

select relname,parttype,parentid,boundaries from pg_partition where parentid in (SELECT parentid FROM pg_partition where relname='orders_2');


2、写入测试数据并访问

--插入测试数据

INSERT INTO orders_2(id,customer_id,order_date)VALUES(1001,100,date '20230613');

INSERT INTO orders_2(id,customer_id,order_date)VALUES(1002,200,date '20230614');

INSERT INTO orders_2(id,customer_id,order_date)VALUES(1003,300,date '20230615');

INSERT INTO orders_2(id,customer_id,order_date)VALUES(1004,400,date '20230612');
----访问分区表:

--查询customer_id 为100的订单表信息

SELECT * FROM orders_2 WHERE customer_id =100;
--查询customer_id 为100、200的订单表信息

SELECT * FROM orders_2 WHERE customer_id IN (100,200);
--查询customer_id 不是100、200的订单表信息

SELECT * FROM orders_2 WHERE customer_id NOT IN (100,200);


3、删除

--删除分区表 drop table

DROP TABLE orders_2 ;
--删除分区数据 truncate分区

alter table orders_2 truncate partition p2;

示例三:创建列表分区(LIST)

列表分区表:将数据中包含的键值分别存储在不同的分区中,依次将数据映射到每一个分区,分区中包含的键值由创建分区表时指定。


1、以订单表为例,创建一个list分区表

--创建列表分区(LIST)

DROP TABLE orders_3;

CREATE TABLE orders_3 (

id INT PRIMARY KEY,

customer_id INT,

order_date DATE,

product_id INT,

quantity INT

) PARTITION BY LIST (customer_id) (

PARTITION p1 VALUES (100),

PARTITION p2 VALUES (200),

PARTITION p3 VALUES (300),

PARTITION p4 VALUES (400),

PARTITION p5 VALUES (500)

);
--查看创建的分区表信息

select relname,parttype,parentid,boundaries from pg_partition where parentid in (SELECT parentid FROM pg_partition where relname='orders_3');


2、写入测试数据并访问

--插入测试数据

INSERT INTO orders_3(id,customer_id,order_date,product_id,quantity)VALUES(1001,100,date '20230613',1,10);

INSERT INTO orders_3(id,customer_id,order_date,product_id,quantity)VALUES(1002,100,date '20230613',2,20);

INSERT INTO orders_3(id,customer_id,order_date,product_id,quantity)VALUES(1003,100,date '20230613',3,30);

INSERT INTO orders_3(id,customer_id,order_date,product_id,quantity)VALUES(1004,100,date '20230613',4,40);
--访问分区表

--根据分区字段查询

select * from orders_3 where customer_id = 100
--根据分区P1查询

select * from orders_3 partition (p1);


3、ADD/TRUNCATE/DROP

--ADD,增加分区

ALTER TABLE orders_3 add partition p6 values (600);
--TRUNCATE,删除分区数据

ALTER TABLE orders_3 truncate partition p6;
--DROP,删除分区表

ALTER TABLE orders_3 drop partition p6;


五、总结

GaussDB云数据库是一款高性能、高可用的云原生关系型数据库,支持多种数据存储和计算引擎。其中,分区表是GaussDB云数据库的一项重要特性,在GaussDB云数据库中使用分区表,可以帮助用户提高查询性能、降低存储成本、方便数据维护等方面的问题。


——结束。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论