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

openGauss每日一练第8天 | openGauss分区表

原创 lxs_data 2021-12-08
1931

什么是分区?

     分区介绍

          数据分区是在一个节点内部数据按照用户指定的策略做进一步的水平分表,将表按照指定范围划分为多个数据互不重叠的部分

     分区表的好处

         改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索效率。

         增强可用性:如果分区表的某个分区出现故障,表在其他分区的数据仍然可用。

         均衡I/O:可以把不同的分区映射到不同的磁盘以平衡I/O,改善整个系统性能。

     分区表类型

         openGauss数据库分区表类型:

                                               范围分区表

                                               列表分区表

                                               哈希分区表

          范围分区表:数据基于范围映射到每一个分区,这个范围是由创建分区表时指定的分区键决定的。

                              范围分区功能,即根据表的一列或者多列,将要插入表的记录分为若干个范围(这些范围在不同的分区里没有重叠),然后为每个范围创建一个分区,用来存储相应的数据。

          列表分区表:将数据基于各个分区内包含的键值映射到每一个分区,分区包含的键值在创建分区时指定
                              列表分区功能,即根据表的一列,将要插入表的记录中出现的键值分为若干个列表(这些列表在不同的分区里没有重叠),为每个列表创建一个分区,用来存储相应的数据。

          哈希分区表:将数据通过哈希映射到每一个分区,每一个分区中存储具有相同哈希值的记录

                              哈希分区功能,即根据表的一列,通过内部哈希算法将要插入表的记录划分到对应的分区中。

     openGauss 分区表其他优势:

                    支持范围分区表的合并功能。
                   List/Hash分区表支持数据交换

分区表操作练习

首先连接openGauss 数据库,连接命令如下:

root@modb:~# su - omm
omm@modb:~$ gsql -r

创建一个含有5个分区的范围分区表store,在每个分区中插入记录

创建含有5个分区的范围分区表store,语句如下:

omm=# create table store

omm-# (
omm(# lxs1 int,
omm(# lxs2 CHAR(2)
omm(# )
omm-# partition by range (lxs1)
omm-# (
omm(# partition store_p1 values less than (10),
omm(# partition store_p2 values less than (20),
omm(# partition store_p3 values less than (30),
omm(# partition store_p4 values less than (40),
omm(# partition store_p5 values less than (50));
CREATE TABLE

查看分区表信息,语句如下:

omm=# \d+ store
Table "public.store"
Column | Type | Modifiers | Storage | Stats target | Description
--------+--------------+-----------+----------+--------------+-------------
lxs1 | integer | | plain | |
lxs2 | character(2) | | extended | |
Range partition by(lxs1)
Number of partition: 5 (View pg_partition to check each partition range.)
Has OIDs: no
Options: orientation=row, compression=no

在每个分区中插入记录,语句如下:

omm=# insert into store values (5, 'l');
INSERT 0 1
omm=# insert into store values (11, 'l');
INSERT 0 1
omm=# insert into store values (21, 'l');
INSERT 0 1
omm=# insert into store values (33, 'l');
INSERT 0 1
omm=# insert into store values (44, 'l');
INSERT 0 1


操作截图:




查看分区1上的数据

看分区1上的数据,语句如下:

omm=# select * from store partition(store_p1);
lxs1 | lxs2
------+------
5 | l
(1 row)

操作截图:


重命名分区2

重命名分区2 为store_lxs_data_p2,语句如下:

omm=# alter table store rename partition store_p2 to store_lxs_data_p2;
ALTER TABLE

查看分区表信息,语句如下:

omm=# SELECT t1.relname, partstrategy, boundaries FROM pg_partition t1, pg_class t2 WHERE t1.parentid = t2.oid AND t2.relname = 'store' AND t1.parttype = 'p';

 store_p4            | r              | {40}
store_p3             | r              | {30}
store_p1             | r              | {10}
(5 rows)

omm=# relname | partstrategy | boundaries
-------------------+--------------+------------
store_lxs_data_p2      | r               | {20}
store_p5                    | r               | {50}

操作截图:



删除分区5

查询表store 中存在哪些分区,语句如下:

omm=# SELECT t1.relname, partstrategy, boundaries FROM pg_partition t1, pg_class t2 WHERE t1.parentid = t2.oid AND t2.relname = 'store' AND t1.parttype = 'p';
relname | partstrategy | boundaries
-------------------+--------------+------------
store_lxs_data_p2   | r               | {20}
store_p5                 | r               | {50}
store_p4                 | r               | {40}
store_p3                 | r               | {30}
store_p1                 | r               | {10}
(5 rows)

删除分区5,语句如下:

omm=# alter table store drop partition store_p5;
ALTER TABLE

再次查询表store 中存在哪些分区,语句如下:

omm=# SELECT t1.relname, partstrategy, boundaries FROM pg_partition t1, pg_class t2 WHERE t1.parentid = t2.oid AND t2.relname = 'store' AND t1.parttype = 'p';
relname | partstrategy | boundaries
-------------------+--------------+------------
store_lxs_data_p2         | r        | {20}
store_p4                       | r        | {40}
store_p3                       | r        | {30}
store_p1                       | r        | {10}
(4 rows)

可以看出分区5已经删除了。

操作截图下:


增加分区6

增加分区6,分为名为:store_lxs_data_p6 ,范围值为100,语句如下:

omm=# alter table store add partition store_lxs_data_p6 values less than (100);
ALTER TABLE

查询表store 中存在哪些分区,语句如下:

omm=# SELECT t1.relname, partstrategy, boundaries FROM pg_partition t1, pg_class t2 WHERE t1.parentid = t2.oid AND t2.relname = 'store' AND t1.parttype = 'p';
store_p3            | r       | {30}
store_p1            | r       | {10}
(5 rows)
omm=# relname | partstrategy | boundaries
-------------------+--------------+------------
store_lxs_data_p6     | r              | {100}
store_lxs_data_p2     | r              | {20}
store_p4                   | r              | {40}

可以到存在一个分区6,名为store_lxs_data_p6,范围值为100.

操作截图:


在系统表pg_partition中查看分区信息

系统表pg_partition中查看分区信息,只查系统表pg_partition,语句如下:

omm=# SELECT relname, partstrategy, boundaries FROM pg_partition;
relname | partstrategy | boundaries
-------------------+--------------+------------
store           | r     |
store_p1     | r     | {10}
store_p3     | r     | {30}
store_p4     | r     | {40}
store_lxs_data_p2    | r    | {20}
store_lxs_data_p6    | r    | {100}
(6 rows)

   可以看出不仅有分区表信息,还存在表信息。

通过关联系统表pg_partition限定表为store,只查询出分区表信息,语句如下:

omm=# SELECT t1.relname, partstrategy, boundaries FROM pg_partition t1, pg_class t2 WHERE t1.parentid = t2.oid AND t2.relname = 'store' AND t1.parttype = 'p';
relname | partstrategy | boundaries
-------------------+--------------+------------
store_lxs_data_p6    | r   | {100}
store_lxs_data_p2    | r   | {20}
store_p4                  | r   | {40}
store_p3                  | r   | {30}
store_p1                  | r   | {10}
(5 rows)

操作截图如下:


删除分区表

查询表store 中存在哪些分区,语句如下:

omm=# SELECT t1.relname, partstrategy, boundaries FROM pg_partition t1, pg_class t2 WHERE t1.parentid = t2.oid AND t2.relname = 'store' AND t1.parttype = 'p';
relname | partstrategy | boundaries
-------------------+--------------+------------
store_lxs_data_p6    | r   | {100}
store_lxs_data_p2    | r   | {20}
store_p4                  | r   | {40}
store_p3                  | r   | {30}
store_p1                  | r   | {10}
(5 rows)

删除分区2和3,语句如下:

omm=# alter table store drop partition store_lxs_data_p2;
ALTER TABLE
omm=# alter table store drop partition store_p3;
ALTER TABLE

再次查询表store 中存在哪些分区,语句如下:

omm=# SELECT t1.relname, partstrategy, boundaries FROM pg_partition t1, pg_class t2 WHERE t1.parentid = t2.oid AND t2.relname = 'store' AND t1.parttype = 'p';
relname | partstrategy | boundaries
-------------------+--------------+------------
store_lxs_data_p6     | r               | {100}
store_p4                   | r               | {40}
store_p1                   | r               | {10}
(3 rows)

可以看到分区2 和分区3 已经删除。

操作截图:


删除分区表store ,语句如下:

omm=# drop table store;
DROP TABLE

omm=# \d+ store;
Did not find any relation named "store".

已经成功删除分区表。

操作截图:

 

ALTER TABLE PARTITION 语句着重记录

       此语句用法可以用于修改表分区,包括增删分区、切割分区、合成分区以及修改分区属性等。

注意以下事项:

  • 添加分区的表空间不能是PG_GLOBAL。
  • 添加分区的名称不能与该分区表已有分区的名称相同。
  • 添加分区的分区键值要和分区表的分区键的类型一致,且要大于分区表中最后一个范围分区的上边界。
  • 如果目标分区表中已有分区数达到了最大值,则不能继续添加分区(范围分区表的分区数最大值是32767,哈希/列表分区表最大值是64)。

  • 当分区表只有一个分区时,不能删除该分区。

  • 选择分区使用PARTITION FOR(),括号里指定值个数应该与定义分区时使用的列个数相同,并且一一对应。

  • Value分区表不支持相应的Alter Partition操作。

  • 列存分区表不支持切割分区。

  • 间隔分区表不支持添加分区。

  • 哈希分区表不支持切割分区,不支持合成分区,不支持添加和删除分区。

  • 列表分区表不支持切割分区,不支持合成分区。

  • 只有分区表的所有者或者被授予了分区表ALTER权限的用户有权限执行ALTER TABLE PARTITION命令,系统管理员默认拥有此权限。

语法格式:

ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name )}
action [, ... ];

openGauss 第八天,持续打卡中!!!!!!


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

评论