【openGauss实战9】深度分析分区表

news/2024/5/9 21:51:33/文章来源:https://blog.csdn.net/weixin_41645135/article/details/128991963

📢📢📢📣📣📣
哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验
一位上进心十足的【大数据领域博主】!😜😜😜
中国DBA联盟(ACDU)成员,目前服务于工业互联网
擅长主流Oracle、MySQL、PG、高斯及GP 运维开发,备份恢复,安装迁移,性能优化、故障应急处理等。
✨ 如果有对【数据库】感兴趣的【小可爱】,欢迎关注【IT邦德】💞💞💞
❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️

文章目录

  • 前言
    • 📣 1.何为分区表
    • 📣 2.分区表类型
      • ✨ 2.1 范围分区表
      • ✨ 2.2 列表分区表
      • ✨ 2.3 间隔分区表
      • ✨ 2.4 哈希分区表
    • 📣 3.分区表维护
      • ✨ 3.1 常用语法
      • ✨ 3.2 案例

前言

本篇介绍了openGauss的分区表的实践应用

📣 1.何为分区表

一张表内的数据过多时,就会严重影响到数据的查询和操作效率。openGauss支持把一张表从逻辑上分成多个小的分片,从而避免一次处理大量数据,提高处理效率。随着现代信息数据的快速增长,数据库的数据量也不断增长。对于庞大的数据如何管理呢?从数据库角度看,分区表无疑是一种很好的选择。

在这里插入图片描述

对于大多数用户使用场景,分区表和普通表相比具有以下优点:
改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索效率。
增强可用性:如果分区表的某个分区出现故障,表在其他分区的数据仍然可用。
均衡I/O:可以把不同的分区映射到不同的磁盘以平衡I/O,改善整个系统性能。

📣 2.分区表类型

openGauss数据库支持这些划分类型:
(1) 范围分区表:指定一个或多个列划分为多个范围,每个范围创建一个分区,用来存储相应的数据。
例如可以采用日期划分范围,将销售数据按照月份进行分区。
(2) 列表分区表:直接按照一个列上的值来划分出分区。例如可以采用销售门店划分销售数据。
(3) 间隔分区表:是一种特殊的范围分区,新增了间隔值定义。当插入记录找不到匹配的分区时可以根据间隔值自动创建分区。
(4) 哈希分区表:根据表的一列,为每个分区指定模数和余数,将要插入表的记录划分到对应的分区中。

✨ 2.1 范围分区表

范围分区表按照划分范围的方式,分为以下类别:
(1) VALUES LESS THAN:通过给出每个分区的上限来确定分区范围。上个分区的上限<=分区的范围<本分区的上限。
(2) START END:通过以下方式划分:
分区的起点和终点;
仅给出分区起点;
仅给出分区终点;
给出分区起点和终点后,再给出该范围内的间隔值。

📢📢📢 创建VALUES LESS THAN范围分区

1.语法格式
CREATE TABLE partition_table_name
( [column_name data_type ][, ... ]
)PARTITION BY RANGE (partition_key)(PARTITION partition_name VALUES LESS THAN (partition_value | MAXVALUE})[, ... ]);2.参数说明
partition_table_name:分区表的名称
column_name:新表中要创建的字段名。
data_type:字段的数据类型。
partition_key:partition_key为分区键的名称。
注:对于从句是VALUE LESS THAN的语法格式,范围分区策略的分区键最多支持4列。
partition_name:partition_name为范围分区的名称。
VALUES LESS THAN:分区中的数值必须小于上边界值。
partition_value:范围分区的上边界,取值依赖于partition_key的类型。
MAXVALUE:表示分区的上边界,它通常用于设置最后一个范围分区的上边界。3.分区表示例
示例1:创建范围分区表sales_table,含有4个分区,分区键为DATE类型。
分区的范围分别为:
sales_date<2022-04-01,
2022-04-01<= sales_date<2022-07-01,
2022-07-01<=sales_date< 2022-10-01,
2022-10-01 <= sales_date< MAXVALUE--创建分区表sales_table。
openGauss=# CREATE TABLE sales_table
(order_no              INTEGER          NOT NULL,goods_name            CHAR(20)         NOT NULL,sales_date            DATE             NOT NULL,sales_volume          INTEGER,sales_store           CHAR(20)
)
PARTITION BY RANGE(sales_date)
(PARTITION season1 VALUES LESS THAN('2022-04-01 00:00:00'),PARTITION season2 VALUES LESS THAN('2022-07-01 00:00:00'),PARTITION season3 VALUES LESS THAN('2022-10-01 00:00:00'),PARTITION season4 VALUES LESS THAN(MAXVALUE)
);
-- 数据插入分区season1
openGauss=# INSERT INTO sales_table VALUES(1, 'jacket', '2022-01-10 00:00:00', 3,'Alaska');-- 数据插入分区season2
openGauss=# INSERT INTO sales_table VALUES(2, 'hat', '2022-05-06 00:00:00', 5,'Clolorado');-- 数据插入分区season3
openGauss=# INSERT INTO sales_table VALUES(3, 'shirt', '2022-09-17 00:00:00', 7,'Florida');-- 数据插入分区season4
openGauss=# INSERT INTO sales_table VALUES(4, 'coat', '2022-10-21 00:00:00', 9,'Hawaii');--查询sales_table的数据
openGauss=# select * from sales_table;order_no |      goods_name      |     sales_date      | sales_volume |     sales_store      
----------+----------------------+---------------------+--------------+----------------------1 | jacket               | 2022-01-10 00:00:00 |            3 | Alaska              2 | hat                  | 2022-05-06 00:00:00 |            5 | Clolorado           2 | hat                  | 2022-05-06 00:00:00 |            5 | Clolorado           4 | coat                 | 2022-10-21 00:00:00 |            9 | Hawaii      --查询sales_table的4季度数据 
openGauss=# SELECT * FROM sales_table PARTITION (season4);order_no |      goods_name      |     sales_date      | sales_volume |     sales_store      
----------+----------------------+---------------------+--------------+----------------------4 | coat                 | 2022-10-21 00:00:00 |            9 | Hawaii                 --查询sales_table的1季度数据 
openGauss=# SELECT * FROM sales_table PARTITION FOR ('2021-01-01 00:00:00');       order_no |      goods_name      |     sales_date      | sales_volume |     sales_store      
----------+----------------------+---------------------+--------------+----------------------1 | jacket               | 2022-01-10 00:00:00 |            3 | Alaska              

在这里插入图片描述

📢📢📢 创建START END范围分区

START END范围分区表有多种表达方式,而且这些方式可以在一个分区表内组合使用。
方式一:START(partition_value) END (partition_value | MAXVALUE)方式CREATE TABLE partition_table_name
( [column_name data_type ][, ... ]
)PARTITION BY RANGE (partition_key)(PARTITION partition_name START(partition_value) END (partition_value | MAXVALUE)[, ... ]);参数说明:
A.partition_name:partition_name为范围分区的名称或者范围分区的名称前缀。
1)若该定义是“START(partition_value) END (partition_value) EVERY (interval_value)”从句,假定其中的partition_name是p1,
则分区的名称依次为p1_1, p1_2, …2)对于完整定义“PARTITION p1 START(1), PARTITION p2 START(2)”,生成的分区是:
(MINVALUE, 1), [1, 2)[2, MAXVALUE),其名称依次为p1_0, p1_1和p2,即此处p1是名称前缀,p2是分区名称。
这里MINVALUE表示最小值B.interval_value:对[START,END) 表示的范围进行切分,interval_value是指定切分后每个分区的宽度。
如果(END-START)值不能整除以EVERY值,则仅最后一个分区的宽度小于EVERY值示例1:以“START(partition_value) END (partition_value | MAXVALUE)”方式创建START END范围分区表graderecord。
含有3个分区,分区键为INTEGER类型。分区的范围分别为:0<= grade<60,60<= grade<90,90<=grade< MAXVALUE。--创建分区表graderecord。
openGauss=# CREATE TABLE graderecord(number INTEGER,name CHAR(20),class CHAR(20),grade INTEGER)PARTITION BY RANGE(grade)(PARTITION pass START(60) END(90),PARTITION excellent START(90) END(MAXVALUE));-- 数据插入分区。
openGauss=# insert into graderecord values('210101','Alan','21.01',92);
openGauss=# insert into graderecord values('210102','Ben','21.01',62);
openGauss=# insert into graderecord values('210103','Brain','21.01',26);
openGauss=# insert into graderecord values('210204','Carl','21.02',77);
openGauss=# insert into graderecord values('210205','David','21.02',47);
openGauss=# insert into graderecord values('210206','Eric','21.02',97);
openGauss=# insert into graderecord values('210307','Frank','21.03',90);
openGauss=# insert into graderecord values('210308','Gavin','21.03',100);
openGauss=# insert into graderecord values('210309','Henry','21.03',67);
openGauss=# insert into graderecord values('210410','Jack','21.04',75);
openGauss=# insert into graderecord values('210311','Jerry','21.04',60);--查询graderecord的数据。
openGauss=# SELECT * FROM graderecord;number |         name         |        class         | grade
--------+----------------------+----------------------+-------210103 | Brain                | 21.01                |    26210205 | David                | 21.02                |    47210102 | Ben                  | 21.01                |    62210204 | Carl                 | 21.02                |    77210309 | Henry                | 21.03                |    67210410 | Jack                 | 21.04                |    75210311 | Jerry                | 21.04                |    60210101 | Alan                 | 21.01                |    92210206 | Eric                 | 21.02                |    97210307 | Frank                | 21.03                |    90210308 | Gavin                | 21.03                |   100
(11 rows)--查询graderecord的pass分区数据。
openGauss=# SELECT * FROM graderecord PARTITION (pass);
ERROR:  partition "pass" of relation "graderecord" does not exist
查询失败。
原因是“PARTITION pass START(60) END(90),”是第一个分区定义,且该定义有START值,
则范围(MINVALUE, 60)将自动作为第一个实际分区,其名称为“pass_0”。
而该定义语义描述的“60<= grade<90”分区的名称为“pass_1”。--查询graderecord的pass_0分区数据。
openGauss=# SELECT * FROM graderecord PARTITION (pass_0);number |         name         |        class         | grade
--------+----------------------+----------------------+-------210103 | Brain                | 21.01                |    26210205 | David                | 21.02                |    47
(2 rows)--查询graderecord的pass_1分区数据。
openGauss=# SELECT * FROM graderecord PARTITION (pass_1);number |         name         |        class         | grade
--------+----------------------+----------------------+-------210102 | Ben                  | 21.01                |    62210204 | Carl                 | 21.02                |    77210309 | Henry                | 21.03                |    67210410 | Jack                 | 21.04                |    75210311 | Jerry                | 21.04                |    60
(5 rows)--查询graderecord的execllent分区数据。
openGauss=# SELECT * FROM graderecord PARTITION (excellent);number |         name         |        class         | grade
--------+----------------------+----------------------+-------210101 | Alan                 | 21.01                |    92210206 | Eric                 | 21.02                |    97210307 | Frank                | 21.03                |    90210308 | Gavin                | 21.03                |   100
(4 rows)示例2:以“START(partition_value) END (partition_value) EVERY (interval_value)”
方式创建START END范围分区表metro_ride_record。
含有7个分区,分区键为INTEGER类型。总范围是ride_stations_number<21, 每3站为一个分区。
--创建分区表metro_ride_record。记录乘车人、上下车站点、乘坐站点数量。并按照乘坐站点数量,每3站建立一个分区。
openGauss=# CREATE TABLE metro_ride_record(record_number INTEGER,name CHAR(20),enter_station CHAR(20),leave_station CHAR(20),ride_stations_number INTEGER)PARTITION BY RANGE(ride_stations_number)(PARTITION cost START(3) END(21)  EVERY (3));-- 数据插入分区。
openGauss=# insert into metro_ride_record values('120101','Brain','Tung Chung','Tsing Yi',2);
openGauss=# insert into metro_ride_record values('120102','David','Po Lam','Yau Tong',4);
openGauss=# insert into metro_ride_record values('120103','Ben','Yau Ma Tei','Wong Tai Sin',6);
openGauss=# insert into metro_ride_record values('120104','Carl','Tai Wo Hau','Prince Edward',8);
openGauss=# insert into metro_ride_record values('120105','Henry','Admiralty','Lai King',10);
openGauss=# insert into metro_ride_record values('120106','Jack','Chai Wan','Central',12);
openGauss=# insert into metro_ride_record values('120107','Jerry','Central','Tai Wo Hau',14);
openGauss=# insert into metro_ride_record values('120108','Alan','Diamond Hill','Kwai Hing',16);
openGauss=# insert into metro_ride_record values('120109','Eric','Jordan','Shek Kip Mei',18);
openGauss=# insert into metro_ride_record values('120110','Frank','Lok Fu','Sunny Bay',20);--查询metro_ride_record的数据。
openGauss=# SELECT * FROM metro_ride_record;record_number |         name         |    enter_station     |    leave_station     | ride_stations_number
---------------+----------------------+----------------------+----------------------+----------------------120101 | Brain                | Tung Chung           | Tsing Yi             |                    2120102 | David                | Po Lam               | Yau Tong             |                    4120103 | Ben                  | Yau Ma Tei           | Wong Tai Sin         |                    6120104 | Carl                 | Tai Wo Hau           | Prince Edward        |                    8120105 | Henry                | Admiralty            | Lai King             |                   10120106 | Jack                 | Chai Wan             | Central              |                   12120107 | Jerry                | Central              | Tai Wo Hau           |                   14120108 | Alan                 | Diamond Hill         | Kwai Hing            |                   16120109 | Eric                 | Jordan               | Shek Kip Mei         |                   18120110 | Frank                | Lok Fu               | Sunny Bay            |                   20
(10 rows)“PARTITION cost START(3) END(21)  EVERY (3)”是第一个分区定义,且该定义有START值,则范围(MINVALUE, 3)将自动作为第一个实际分区,其名称为“cost_0”。
其余分区依次为“cost_1”、...、“cost_6”.--查询metro_ride_record的cost_0分区数据。
openGauss=# SELECT * FROM metro_ride_record PARTITION (cost_0);record_number |         name         |    enter_station     |    leave_station     | ride_stations_number
---------------+----------------------+----------------------+----------------------+----------------------120101 | Brain                | Tung Chung           | Tsing Yi             |                    2
(1 row)--查询metro_ride_record的cost_1分区数据。
openGauss=# SELECT * FROM metro_ride_record PARTITION (cost_1);record_number |         name         |    enter_station     |    leave_station     | ride_stations_number
---------------+----------------------+----------------------+----------------------+----------------------120102 | David                | Po Lam               | Yau Tong             |                    4
(1 row)--查询metro_ride_record的cost_6分区数据。
openGauss=# SELECT * FROM metro_ride_record PARTITION (cost_6);record_number |         name         |    enter_station     |    leave_station     | ride_stations_number
---------------+----------------------+----------------------+----------------------+----------------------120109 | Eric                 | Jordan               | Shek Kip Mei         |                   18120110 | Frank                | Lok Fu               | Sunny Bay            |                   20
(2 rows)示例3:以“START(partition_value) ”方式创建START END范围分区表graderecord。
含有3个分区,分区键为INTEGER类型。分区的范围分别为:0<= grade<60,60<= grade<90,90<=grade< MAXVALUE。--创建分区表graderecord。
openGauss=# CREATE TABLE graderecord(number INTEGER,name CHAR(20),class CHAR(20),grade INTEGER)PARTITION BY RANGE(grade)(PARTITION pass START(60),PARTITION excellent START(90));-- 数据插入分区。
openGauss=# insert into graderecord values('210101','Alan','21.01',92);
openGauss=# insert into graderecord values('210102','Ben','21.01',62);
openGauss=# insert into graderecord values('210103','Brain','21.01',26);
openGauss=# insert into graderecord values('210204','Carl','21.02',77);
openGauss=# insert into graderecord values('210205','David','21.02',47);
openGauss=# insert into graderecord values('210206','Eric','21.02',97);
openGauss=# insert into graderecord values('210307','Frank','21.03',90);
openGauss=# insert into graderecord values('210308','Gavin','21.03',100);
openGauss=# insert into graderecord values('210309','Henry','21.03',67);
openGauss=# insert into graderecord values('210410','Jack','21.04',75);
openGauss=# insert into graderecord values('210311','Jerry','21.04',60);--查询graderecord的数据。
openGauss=# SELECT * FROM graderecord;number |         name         |        class         | grade
--------+----------------------+----------------------+-------210103 | Brain                | 21.01                |    26210205 | David                | 21.02                |    47210102 | Ben                  | 21.01                |    62210204 | Carl                 | 21.02                |    77210309 | Henry                | 21.03                |    67210410 | Jack                 | 21.04                |    75210311 | Jerry                | 21.04                |    60210101 | Alan                 | 21.01                |    92210206 | Eric                 | 21.02                |    97210307 | Frank                | 21.03                |    90210308 | Gavin                | 21.03                |   100
(11 rows)--查询graderecord的pass分区数据。
openGauss=# SELECT * FROM graderecord PARTITION (pass);
ERROR:  partition "pass" of relation "graderecord" does not exist
查询失败。
原因是“PARTITION pass START(60),”是第一个分区定义,且该定义有START值,则范围(MINVALUE, 60)将自动作为第一个实际分区,
其名称为“pass_0”。
而该定义语义描述的“60<= grade<90”分区的名称为“pass_1”。--查询graderecord的pass_0分区数据。
openGauss=# SELECT * FROM graderecord PARTITION (pass_0);number |         name         |        class         | grade
--------+----------------------+----------------------+-------210103 | Brain                | 21.01                |    26210205 | David                | 21.02                |    47
(2 rows)--查询graderecord的pass_1分区数据。
openGauss=# SELECT * FROM graderecord PARTITION (pass_1);number |         name         |        class         | grade
--------+----------------------+----------------------+-------210102 | Ben                  | 21.01                |    62210204 | Carl                 | 21.02                |    77210309 | Henry                | 21.03                |    67210410 | Jack                 | 21.04                |    75210311 | Jerry                | 21.04                |    60
(5 rows)--查询graderecord的execllent分区数据。
openGauss=# SELECT * FROM graderecord PARTITION (excellent);number |         name         |        class         | grade
--------+----------------------+----------------------+-------210101 | Alan                 | 21.01                |    92210206 | Eric                 | 21.02                |    97210307 | Frank                | 21.03                |    90210308 | Gavin                | 21.03                |   100
(4 rows)示例4:以“END(partition_value | MAXVALUE) ”方式创建START END范围分区表graderecord。
含有3个分区,分区键为INTEGER类型。
分区的范围分别为:0<= grade<60,60<= grade<90,90<=grade< MAXVALUE。--创建分区表graderecord。
openGauss=# CREATE TABLE graderecord(number INTEGER,name CHAR(20),class CHAR(20),grade INTEGER)PARTITION BY RANGE(grade)(PARTITION no_pass END(60),PARTITION pass END(90),PARTITION excellent END(MAXVALUE));-- 数据插入分区。
openGauss=# insert into graderecord values('210101','Alan','21.01',92);
openGauss=# insert into graderecord values('210102','Ben','21.01',62);
openGauss=# insert into graderecord values('210103','Brain','21.01',26);
openGauss=# insert into graderecord values('210204','Carl','21.02',77);
openGauss=# insert into graderecord values('210205','David','21.02',47);
openGauss=# insert into graderecord values('210206','Eric','21.02',97);
openGauss=# insert into graderecord values('210307','Frank','21.03',90);
openGauss=# insert into graderecord values('210308','Gavin','21.03',100);
openGauss=# insert into graderecord values('210309','Henry','21.03',67);
openGauss=# insert into graderecord values('210410','Jack','21.04',75);
openGauss=# insert into graderecord values('210311','Jerry','21.04',60);--查询graderecord的数据。
openGauss=# SELECT * FROM graderecord;number |         name         |        class         | grade
--------+----------------------+----------------------+-------210103 | Brain                | 21.01                |    26210205 | David                | 21.02                |    47210102 | Ben                  | 21.01                |    62210204 | Carl                 | 21.02                |    77210309 | Henry                | 21.03                |    67210410 | Jack                 | 21.04                |    75210311 | Jerry                | 21.04                |    60210101 | Alan                 | 21.01                |    92210206 | Eric                 | 21.02                |    97210307 | Frank                | 21.03                |    90210308 | Gavin                | 21.03                |   100
(11 rows)--查询graderecord的no_pass分区数据。
openGauss=# SELECT * FROM graderecord PARTITION (no_pass);number |         name         |        class         | grade
--------+----------------------+----------------------+-------210103 | Brain                | 21.01                |    26210205 | David                | 21.02                |    47
(2 rows)--查询graderecord的pass分区数据。
openGauss=# SELECT * FROM graderecord PARTITION (pass);number |         name         |        class         | grade
--------+----------------------+----------------------+-------210102 | Ben                  | 21.01                |    62210204 | Carl                 | 21.02                |    77210309 | Henry                | 21.03                |    67210410 | Jack                 | 21.04                |    75210311 | Jerry                | 21.04                |    60
(5 rows)--查询graderecord的execllent分区数据。
openGauss=# SELECT * FROM graderecord PARTITION (excellent);number |         name         |        class         | grade
--------+----------------------+----------------------+-------210101 | Alan                 | 21.01                |    92210206 | Eric                 | 21.02                |    97210307 | Frank                | 21.03                |    90210308 | Gavin                | 21.03                |   100
(4 rows)

✨ 2.2 列表分区表

1.语法
CREATE TABLE partition_table_name
( [column_name data_type ][, ... ]
)PARTITION BY LIST (partition_key)(PARTITION partition_name VALUES (list_values_clause)[, ... ]);list_values_clause:对应分区存在的一个或者多个键值。多个键值之间以逗号分隔。
VALUES (DEFAULT):加入的数据如有“list_values_clause”中未列出的键值,存放在VALUES (DEFAULT)对应的分区。
MAXVALUE:MAXVALUE表示分区的上边界,它通常用于设置最后一个范围分区的上边界。2.示例:
创建列表分区表graderecord。含有4个分区,分区键为CHAR类型。分区的范围分别为:21.01,21.02,21.03,21.04。--创建分区表graderecord。
openGauss=# CREATE TABLE graderecord(number INTEGER,name CHAR(20),class CHAR(20),grade INTEGER)PARTITION BY LIST(class)(PARTITION class_01 VALUES ('21.01'),PARTITION class_02 VALUES ('21.02'),PARTITION class_03 VALUES ('21.03'),PARTITION class_04 VALUES ('21.04'));-- 数据插入分区。
openGauss=# insert into graderecord values('210101','Alan','21.01',92);
openGauss=# insert into graderecord values('210102','Ben','21.01',62);
openGauss=# insert into graderecord values('210103','Brain','21.01',26);
openGauss=# insert into graderecord values('210204','Carl','21.02',77);
openGauss=# insert into graderecord values('210205','David','21.02',47);
openGauss=# insert into graderecord values('210206','Eric','21.02',97);
openGauss=# insert into graderecord values('210307','Frank','21.03',90);
openGauss=# insert into graderecord values('210308','Gavin','21.03',100);
openGauss=# insert into graderecord values('210309','Henry','21.03',67);
openGauss=# insert into graderecord values('210410','Jack','21.04',75);
openGauss=# insert into graderecord values('210311','Jerry','21.04',60);--查询graderecord的数据。
openGauss=# SELECT * FROM graderecord;number |         name         |        class         | grade
--------+----------------------+----------------------+-------210410 | Jack                 | 21.04                |    75210311 | Jerry                | 21.04                |    60210307 | Frank                | 21.03                |    90210308 | Gavin                | 21.03                |   100210309 | Henry                | 21.03                |    67210204 | Carl                 | 21.02                |    77210205 | David                | 21.02                |    47210206 | Eric                 | 21.02                |    97210101 | Alan                 | 21.01                |    92210102 | Ben                  | 21.01                |    62210103 | Brain                | 21.01                |    26
(11 rows)--查询graderecord的class_01分区数据。
openGauss=# SELECT * FROM graderecord PARTITION (class_01);number |         name         |        class         | grade
--------+----------------------+----------------------+-------210101 | Alan                 | 21.01                |    92210102 | Ben                  | 21.01                |    62210103 | Brain                | 21.01                |    26
(3 rows)--查询graderecord的class_04分区数据。
openGauss=# SELECT * FROM graderecord PARTITION (class_04);number |         name         |        class         | grade
--------+----------------------+----------------------+-------210410 | Jack                 | 21.04                |    75210311 | Jerry                | 21.04                |    60
(2 rows)

✨ 2.3 间隔分区表

间隔分区是在范围分区的基础上,增加了间隔值
1.VALUES LESS THAN间隔分区语法格式
CREATE TABLE partition_table_name
( [column_name data_type ][, ... ]
)PARTITION BY RANGE (partition_key)(INTERVAL ('interval_expr')PARTITION partition_name VALUES LESS THAN (partition_value | MAXVALUE})[, ... ]);interval_expr自动创建分区的间隔,例如:自动创建分区的间隔,例如:1 day、1 month。2.示例:
--创建分区表sales_table。
openGauss=# CREATE TABLE sales_table
(order_no              INTEGER          NOT NULL,goods_name            CHAR(20)         NOT NULL,sales_date            DATE             NOT NULL,sales_volume          INTEGER,sales_store           CHAR(20)
)
PARTITION BY RANGE(sales_date)INTERVAL ('1 month')(PARTITION start VALUES LESS THAN('2021-01-01 00:00:00'),PARTITION later VALUES LESS THAN('2021-01-10 00:00:00'));
-- 数据插入分区later
openGauss=# INSERT INTO sales_table VALUES(1, 'jacket', '2021-01-8 00:00:00', 3,'Alaska');-- 不在已有分区的数据插入,系统会新建分区sys_p1。
openGauss=# INSERT INTO sales_table VALUES(2, 'hat', '2021-04-06 00:00:00', 255,'Clolorado');-- 不在已有分区的数据插入,系统会新建分区sys_p2。
openGauss=# INSERT INTO sales_table VALUES(3, 'shirt', '2021-11-17 00:00:00', 7000,'Florida');-- 数据插入分区start
openGauss=# INSERT INTO sales_table VALUES(4, 'coat', '2020-10-21 00:00:00', 9000,'Hawaii');--查询sales_table的数据。
openGauss=# SELECT * FROM sales_table;order_no |      goods_name      |     sales_date      | sales_volume |     sales_store
----------+----------------------+---------------------+--------------+----------------------4 | coat                 | 2020-10-21 00:00:00 |         9000 | Hawaii1 | jacket               | 2021-01-08 00:00:00 |            3 | Alaska2 | hat                  | 2021-04-06 00:00:00 |          255 | Clolorado3 | shirt                | 2021-11-17 00:00:00 |         7000 | Florida
(4 rows)--查询sales_table的start分区数据。这里采用“sales_table PARTITION (start);”来引用分区。
openGauss=# SELECT * FROM sales_table PARTITION (start);order_no |      goods_name      |     sales_date      | sales_volume |     sales_store
----------+----------------------+---------------------+--------------+----------------------4 | coat                 | 2020-10-21 00:00:00 |         9000 | Hawaii
(1 row)--查询sales_table的later分区数据。这里采用“sales_table PARTITION (later);”来引用分区。
openGauss=# SELECT * FROM sales_table PARTITION (later);order_no |      goods_name      |     sales_date      | sales_volume |     sales_store
----------+----------------------+---------------------+--------------+----------------------1 | jacket               | 2021-01-08 00:00:00 |            3 | Alaska
(1 row)--查询sales_table的sys_p1分区数据。这里采用“sales_table PARTITION (sys_p1);”来引用分区。
openGauss=# SELECT * FROM sales_table PARTITION (sys_p1);order_no |      goods_name      |     sales_date      | sales_volume |     sales_store
----------+----------------------+---------------------+--------------+----------------------2 | hat                  | 2021-04-06 00:00:00 |          255 | Clolorado
(1 row)--查询sales_table的sys_p2分区数据。这里采用“sales_table PARTITION (sys_p2);”来引用分区。
openGauss=# SELECT * FROM sales_table PARTITION (sys_p2);order_no |      goods_name      |     sales_date      | sales_volume |     sales_store
----------+----------------------+---------------------+--------------+----------------------3 | shirt                | 2021-11-17 00:00:00 |         7000 | Florida
(1 row)

✨ 2.4 哈希分区表

1.语法
CREATE TABLE partition_table_name
( [column_name data_type ][, ... ]
)PARTITION BY HASH (partition_key)(PARTITION partition_name )[, ... ]);partition_name:哈希分区的名称。希望创建几个哈希分区就给出几个分区名。2.创建哈希分区表hash_partition_table
openGauss=# create table hash_partition_table (
col1 int,
col2 int)
partition by hash(col1)
(
partition p1,
partition p2
);-- 数据插入
openGauss=# INSERT INTO hash_partition_table VALUES(1, 1);
INSERT 0 1
openGauss=# INSERT INTO hash_partition_table VALUES(2, 2);
INSERT 0 1
openGauss=# INSERT INTO hash_partition_table VALUES(3, 3);
INSERT 0 1
openGauss=# INSERT INTO hash_partition_table VALUES(4, 4);
INSERT 0 1-- 查看数据
openGauss=# select * from hash_partition_table partition (p1);col1 | col2
------+------3 |    34 |    4
(2 rows)openGauss=# select * from hash_partition_table partition (p2);col1 | col2
------+------1 |    12 |    2
(2 rows)

📣 3.分区表维护

✨ 3.1 常用语法

删除分区:
ALTER TABLE partition_table_name DROP PARTITION partition_name;

增加分区:
ALTER TABLE partition_table_name ADD {partition_less_than_item | partition_start_end_item| partition_list_item };

重命名分区:
ALTER TABLE partition_table_name RENAME PARTITION partition_name TO partition_new_name;

分裂分区(指定切割点split_partition_value的语法):
ALTER TABLE partition_table_name SPLIT PARTITION partition_name AT ( split_partition_value ) INTO ( PARTITION partition_new_name1, PARTITION partition_new_name2);

分裂分区(指定分区范围的语法):
ALTER TABLE partition_table_name SPLIT PARTITION partition_name INTO { ( partition_less_than_item [, …] ) | ( partition_start_end_item [, …] ) };

合并分区:
ALTER TABLE partition_table_name MERGE PARTITIONS { partition_name } [, …] INTO PARTITION partition_name;

✨ 3.2 案例

--创建分区表employees_table。
openGauss=# CREATE TABLE employees_table
(employee_id              INTEGER          NOT NULL,employee_name            CHAR(20)         NOT NULL,onboarding_date          DATE             NOT NULL,position                 CHAR(20)
)
PARTITION BY RANGE(onboarding_date)
(PARTITION founders VALUES LESS THAN('2000-01-01 00:00:00'),PARTITION senate VALUES LESS THAN('2010-01-01 00:00:00'),PARTITION seniors VALUES LESS THAN('2020-01-01 00:00:00'),PARTITION newcomer VALUES LESS THAN(MAXVALUE)
);-- 插入数据
openGauss=# INSERT INTO  employees_table VALUES
(1, 'SMITH', '1997-01-10 00:00:00','Manager'),
(2, 'JONES', '2001-05-06 00:00:00', 'Supervisor'),
(3, 'WILLIAMS', '2011-09-17 00:00:00', 'Engineer'),
(4, 'TAYLOR', '2021-10-21 00:00:00', 'Clerk');查看newcomer分区
openGauss=# SELECT * FROM employees_table PARTITION (newcomer);employee_id |    employee_name     |   onboarding_date   |       position
-------------+----------------------+---------------------+----------------------4 | TAYLOR               | 2021-10-21 00:00:00 | Clerk
(1 row)--删除newcomer分区。
openGauss=# ALTER TABLE employees_table DROP PARTITION newcomer;-- 查看newcomer分区数据
openGauss=# select * from employees_table partition (newcomer);--增加fresh分区。
openGauss=# ALTER TABLE employees_table ADD PARTITION fresh VALUES LESS THAN ('2040-01-01 00:00:00');
ALTER TABLE--以2030-01-01 00:00:00为分割点,分裂fresh分区为current、future两个分区
openGauss=# ALTER TABLE employees_table SPLIT PARTITION fresh AT ('2030-01-01 00:00:00') INTO (PARTITION current, PARTITION future);--将分区current改名为now
openGauss=# ALTER TABLE employees_table RENAME PARTITION current TO now;--将founders,senate合并为一个分区original。
openGauss=# ALTER TABLE  employees_table MERGE PARTITIONS founders, senate INTO PARTITION original;openGauss=# select w.relname,w.parttype from pg_partition w;relname     | parttype 
-----------------+----------sales_table     | rseason1         | pseason2         | pseason3         | pseason4         | pemployees_table | rseniors         | pfuture          | pnow             | poriginal        | p

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_256838.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Syzkaller学习笔记---更新syz-extract/syz-sysgen(一)

Syzkaller学习笔记Syzkaller 安装文件系统内核Android common kernel参考文献syzkaller 源码阅读笔记-1前言syz-extractmainarchListcreateArchesworkerprocessArchprocessFileextractcheckUnsupportedCallsarchList小结syz-sysgenmainprocessJob()generateExecutorSyscalls()w…

2016-ICLR-Order Matters- Sequence to sequence for sets

2016-ICLR-Order Matters- Sequence to sequence for sets Paper: [https://arxiv.org/pdf/1511.06391.pdf](https://arxiv.org/pdf/1511.06391.pdf) Code: 顺序重要性&#xff1a;集合的顺序到序列 摘要 许多需要从观察序列映射或映射到观察序列的复杂任务现在可以使用序列…

C++创建多线程的方法总结

下个迭代有个任务很有趣&#xff0c;用大量的线程去访问一个接口&#xff0c;直至其崩溃为止&#xff0c;这就需要多线程的知识&#xff0c;这也不是什么难事&#xff0c;总结一下C中的多线程方法&#xff1a;std、boost、pthread、windows api。 目录 一、多线程预备知识 二…

基于SpringBoot实现ChatGPT-QQ机器人

概述 近期ChatGPT火爆全球&#xff0c;在其官方网站上也列举了非常全面的应用案例&#xff0c;仅仅上线两个月活跃用户数已经达到1亿&#xff0c;成为历史上用户数增长最快的面向消费者的应用 快速体验 OpenAI官网对外提供了标准的 API 接口&#xff0c;可以通过HTTP请求进行…

简单的密码加密

用户的密码必须被加密后再存储到数据库, 否则就存在用户账号安全问题用户使用的原始密码通常称之为"原文"或"明文", 经过算法的运算, 得到的结果通常称之为"密文"在处理密码加密时, 不可以使用任何加密算法, 因为所有加密算法都是可以被逆向运算…

centos学习记录

遇到的问题及其解决办法 centos7安装图形化界面 yum groupinstall ‘X Window System’ yum groupinstall -y ‘GNOME Desktop’ 安装完成后输入init 5进入图形化界面 centos7安装vmware-tools 第一步卸载open-vm-tools 输入命令 yum remove open-vm-tools 输入命令 reboot 在…

微前端基础

一、什么是微前端 微前端是一种软件架构&#xff0c;可以将前端应用拆解成一些更小的能够独立开发部署的微型应用&#xff0c;然后再将这些微应用进行组合使其成为整体应用的架构模式。微前端架构类似于组件架构&#xff0c;但不同的是&#xff0c;组件不能独立构建和发布&…

大数据时代的小数据神器 - asqlcell

自从Google发布了经典的MapReduce论文&#xff0c;以及Yahoo开源了Hadoop的实现&#xff0c;大数据这个词就成为了一个行业的热门。在不断提高的机器性能和各种层出不穷的工具框架加持下&#xff0c;数据分析开始从过去的采样抽查变成全量整体&#xff0c;原先被抽样丢弃的隐藏…

网络安全实验室7.综合关

7.综合关 1.渗透测试第一期 url&#xff1a;http://lab1.xseclab.com/base14_2d7aae2ae829d1d5f45c59e8046bbc54/ 进入忘记密码页面&#xff0c;右键查看源码&#xff0c;发现一个手机号 解题思路&#xff1a;通过给admin用户绑定13388758688手机号码&#xff0c;然后再进行…

使用vue3,vite,less,flask,python从零开始学习硅谷外卖(16-40集)

严正声明&#xff01; 重要的事情说一遍&#xff0c;本文章仅供分享&#xff0c;文章和代码都是开源的&#xff0c;严禁以此牟利&#xff0c;严禁侵犯尚硅谷原作视频的任何权益&#xff0c;我知道学习编程的人各种各样的心思都有&#xff0c;但这不是你对开源社区侵权的理由&am…

【算法题解】15. 设计最小栈

这是一道 中等难度 的题。 题目来自&#xff1a;leetcode 题目 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在 常数时间 内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void p…

驱动 | Linux | NVMe 不完全总结

本文主要参考这里 1’ 2 的解析和 linux 源码 3。 此处推荐一个可以便捷查看 linux 源码的网站 bootlin 4。 更新&#xff1a;2022 / 02 / 11 驱动 | Linux | NVMe 不完全总结NVMe 的前世今生从系统角度看 NVMe 驱动NVMe CommandPCI 总线从架构角度看 NVMe 驱动NVMe 驱动的文件…

详细解读503服务不可用的错误以及如何解决503服务不可用

文章目录1. 问题引言2. 什么是503服务不可用错误3 尝试解决问题3.1 重新加载页面3.2 检查该站点是否为其他人关闭3.3 重新启动设备3.3 联系网站4. 其他解决问的方法1. 问题引言 你以前遇到过错误503吗&#xff1f; 例如&#xff0c;您可能会收到消息&#xff0c;如503服务不可…

三种方式查看linux终端terminal是否可以访问外网ping,curl,wget

方法1&#xff1a;ping注意不要用ping www.google.com.hk来验证&#xff0c;因为有墙&#xff0c;墙阻止了你接受网址发回的响应数据。即使你那啥过&#xff0c;浏览器都可以访问Google&#xff0c;terminal里面也是无法得到响应 百度在墙内&#xff0c;所以可以正常拿到响应信…

sklearn降维算法1 - 降维思想与PCA实现

目录1、概述1.1 维度概念2、PCA与SVD2.1 降维实现2.2 重要参数n_components2.2.1 案例&#xff1a;高维数据的可视化2.2.2 最大似然估计自选超参数2.2.3 按信息量占比选超参数1、概述 1.1 维度概念 shape返回的结果&#xff0c;几维几个方括号嵌套 特征矩阵特指二维的 一般来…

truffle 创建测试合约并部署到测试网络

1、npm 安装truffle npm install -g truffle2、创建truffle项目 mkdir imooc-on-blockchain-truffle && cd imooc-on-blockchain-truffle3、初始化truffle目录&#xff0c;会生成如下几个目录 contracts 存放.sol合约文件migrations 部署脚本目录test 测试文件目录t…

【GlobalMapper精品教程】045:空间分析工具(2)——相交

GlobalMapper提供的空间分析(操作)的方法有:交集、并集、单并集、差异、对称差集、相交、重叠、接触、包含、等于、内部、分离等,本文主要讲述相交工具的使用。 文章目录 一、实验数据二、符号化设置三、相交运算四、结果展示五、心灵感悟一、实验数据 加载配套实验数据(…

分布式之分布式事务V2

写在前面 本文一起来看下分布式环境下的事务问题&#xff0c;即我们经常听到的分布式事务问题。想要解决分布式事务问题&#xff0c;需要使用到分布式事务相关的协议&#xff0c;主要有2PC即两阶段提交协议&#xff0c;TCC&#xff08;try-confirm-cancel&#xff09;&#xf…

html的表单标签(form)

目录标题1、表单标签主要有三大类&#xff1a;2、表单标签中常见的属性3、例子代码及结果4、注意&#xff1a;5、表单中特殊的属性表单标签可以用来数据交互&#xff0c;而前面学的六个标签只能发送不能接收。 表单标签的作用就是数据交互1、表单标签主要有三大类&#xff1a; …

ImageMagick任意文件读取漏洞(CVE-2022-44268)

0x00 前提 前几天爆出一个 ImageMagick 漏洞 &#xff0c;可以造成一个任意文件读取的危害比较可观&#xff0c;最近有时间来复现学习一下 主要是影响的范围很大&#xff0c;很多地方都有这个问题&#xff0c;需要来学习一下 0x01 介绍 ImageMagick 是一个免费的开源软件套…