PostgreSQL 12: 新增 pg_partition_tree() 函数显示分区表信息

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: PostgreSQL 12 新增三个分区查询函数,如下:pg_partition_tree(regclass): 返回分区表详细信息,例如分区名称、上一级分区名称、是否叶子结点、层级,层级 0 表示顶层父表。

PostgreSQL 12 新增三个分区查询函数,如下:

  • pg_partition_tree(regclass): 返回分区表详细信息,例如分区名称、上一级分区名称、是否叶子结点、层级,层级 0 表示顶层父表。
  • pg_partition_ancestors(regclass): 返回上层分区名称,包括本层分区名称。
  • pg_partition_root(regclass): 返回顶层父表名称。

发行说明

Add partition introspection functions (Michaël Paquier, Álvaro Herrera, Amit Langote)

New function pg_partition_root() returns the top-most parent of a partition tree, pg_partition_ancestors() reports all ancestors of a partition, and pg_partition_tree() displays information about partitions.

环境准备: 创建二维分区表

创建父表,如下:

CREATE TABLE userinfo (
 userid    int4,
 username  character varying(64),
 ctime   timestamp(6) without time zone
) PARTITION BY HASH(userid);

创建第一层分区,如下:

CREATE TABLE userinfo_p0 PARTITION OF userinfo FOR VALUES WITH(MODULUS 4, REMAINDER 0) PARTITION BY RANGE(ctime);
CREATE TABLE userinfo_p1 PARTITION OF userinfo FOR VALUES WITH(MODULUS 4, REMAINDER 1);
CREATE TABLE userinfo_p2 PARTITION OF userinfo FOR VALUES WITH(MODULUS 4, REMAINDER 2);
CREATE TABLE userinfo_p3 PARTITION OF userinfo FOR VALUES WITH(MODULUS 4, REMAINDER 3);

创建第二层分区,如下:

CREATE TABLE userinfo_p0_old PARTITION OF userinfo_p0 FOR VALUES FROM (MINVALUE) TO ('2019-06-01');
CREATE TABLE userinfo_p0_201906 PARTITION OF userinfo_p0 FOR VALUES FROM ('2019-06-01') TO ('2019-07-01');
CREATE TABLE userinfo_p0_201907 PARTITION OF userinfo_p0 FOR VALUES FROM ('2019-07-01') TO ('2019-08-01');

使用元命令查看分区表信息,如下:

mydb=> \d+ userinfo
                                        Partitioned table "pguser.userinfo"
  Column  |              Type              | Collation | Nullable | Default | Storage  | Stats target | Description 
----------+--------------------------------+-----------+----------+---------+----------+--------------+-------------
 userid   | integer                        |           |          |         | plain    |              | 
 username | character varying(64)          |           |          |         | extended |              | 
 ctime    | timestamp(6) without time zone |           |          |         | plain    |              | 
Partition key: HASH (userid)
Partitions: userinfo_p0 FOR VALUES WITH (modulus 4, remainder 0), PARTITIONED,
            userinfo_p1 FOR VALUES WITH (modulus 4, remainder 1),
            userinfo_p2 FOR VALUES WITH (modulus 4, remainder 2),
            userinfo_p3 FOR VALUES WITH (modulus 4, remainder 3)
                      

备注:以上可以查看到分区表大部分信息,但二级分区的信息并没有显示,userinfo_p0 这行只显示 PARTITIONED,没有列出二级分区信息。

若想查看二级分区信息,如下:

mydb=> \d+ userinfo_p0
                                       Partitioned table "pguser.userinfo_p0"
  Column  |              Type              | Collation | Nullable | Default | Storage  | Stats target | Description 
----------+--------------------------------+-----------+----------+---------+----------+--------------+-------------
 userid   | integer                        |           |          |         | plain    |              | 
 username | character varying(64)          |           |          |         | extended |              | 
 ctime    | timestamp(6) without time zone |           |          |         | plain    |              | 
Partition of: userinfo FOR VALUES WITH (modulus 4, remainder 0)
Partition constraint: satisfies_hash_partition('16432'::oid, 4, 0, userid)
Partition key: RANGE (ctime)
Partitions: userinfo_p0_201906 FOR VALUES FROM ('2019-06-01 00:00:00') TO ('2019-07-01 00:00:00'),
            userinfo_p0_201907 FOR VALUES FROM ('2019-07-01 00:00:00') TO ('2019-08-01 00:00:00'),
            userinfo_p0_old FOR VALUES FROM (MINVALUE) TO ('2019-06-01 00:00:00')  

pg_partition_tree 函数

使用 pg_partition_tree() 函数查看分区表信息,如下:

mydb=>  SELECT * FROM pg_partition_tree('userinfo');
       relid        | parentrelid | isleaf | level 
--------------------+-------------+--------+-------
 userinfo           |             | f      |     0
 userinfo_p0        | userinfo    | f      |     1
 userinfo_p1        | userinfo    | t      |     1
 userinfo_p2        | userinfo    | t      |     1
 userinfo_p3        | userinfo    | t      |     1
 userinfo_p0_201906 | userinfo_p0 | t      |     2
 userinfo_p0_201907 | userinfo_p0 | t      |     2
 userinfo_p0_old    | userinfo_p0 | t      |     2
(8 rows)

备注: pg_partition_tree() 函数列出了分区表的所有分区、上一级分区、是否是叶子节点、当前分区所处层级信息。

pg_partition_ancestors 函数

pg_partition_ancestors 函数返回上层分区名称,包括本层分区名称,如下:

mydb=> SELECT pg_partition_ancestors('userinfo_p0');
 pg_partition_ancestors 
------------------------
 userinfo_p0
 userinfo
(2 rows)

pg_partition_root 函数

pg_partition_root()函数返回最顶层父表名称,如下:

mydb=> SELECT pg_partition_root('userinfo_p0_201907');
 pg_partition_root 
-------------------
 userinfo
(1 row)

验证数据分布

最后验证二维分区表 userinfo 数据分布,插入测试数据,如下:

INSERT INTO userinfo(userid,username,ctime) SELECT n, n || '_username',now() FROM generate_series(1,8) n;
INSERT INTO userinfo(userid,username,ctime) SELECT n, n || '_username',now() - interval ' 2 months 'FROM generate_series(1,8) n;

验证数据分布,如下:

mydb=> \dt+ userinfo*
                                  List of relations
 Schema |        Name        |       Type        | Owner  |    Size    | Description 
--------+--------------------+-------------------+--------+------------+-------------
 pguser | userinfo           | partitioned table | pguser | 0 bytes    | 
 pguser | userinfo_p0        | partitioned table | pguser | 0 bytes    | 
 pguser | userinfo_p0_201906 | table             | pguser | 8192 bytes | 
 pguser | userinfo_p0_201907 | table             | pguser | 0 bytes    | 
 pguser | userinfo_p0_old    | table             | pguser | 8192 bytes | 
 pguser | userinfo_p1        | table             | pguser | 8192 bytes | 
 pguser | userinfo_p2        | table             | pguser | 8192 bytes | 
 pguser | userinfo_p3        | table             | pguser | 8192 bytes | 
(8 rows)

根据表大小初步判读仅底层分区存储数据。

查看二级分区数据分布上,如下:

mydb=> SELECT * FROM userinfo_p0;
 userid |  username  |           ctime            
--------+------------+----------------------------
      1 | 1_username | 2019-05-16 09:36:18.83122
      1 | 1_username | 2019-07-16 09:36:18.825426
(2 rows)

查看三级分区数据分布,如下:

mydb=> SELECT * FROM userinfo_p0_201907;
 userid |  username  |           ctime            
--------+------------+----------------------------
      1 | 1_username | 2019-07-16 09:36:18.825426
(1 row)

mydb=> SELECT * FROM userinfo_p0_201906;
 userid | username | ctime 
--------+----------+-------
(0 rows)

mydb=> SELECT * FROM userinfo_p0_old;
 userid |  username  |           ctime           
--------+------------+---------------------------
      1 | 1_username | 2019-05-16 09:36:18.83122

总结

对于一维分区表,PostgreSQL 提供的元命令足够查看分区的完整信息,但对于多维分区表,元命令无法查看详尽的分区信息,PostgreSQL 12 提供的分区函数很容易做到这点。

尽管二维分区表的使用并不是很多,分区表函数提供了分区表查询的另一种途径。

参考

新书推荐

最后推荐和张文升共同编写的《PostgreSQL实战》,本书基于PostgreSQL 10 编写,共18章,重点介绍SQL高级特性、并行查询、分区表、物理复制、逻辑复制、备份恢复、高可用、性能优化、PostGIS等,涵盖大量实战用例!

链接:https://item.jd.com/12405774.html

_5_PostgreSQL_

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
2月前
|
JSON 关系型数据库 MySQL
Mysql(5)—函数
MySQL提供了许多内置的函数以帮助用户进行数据操作和分析。这些函数可以分为几类,包括聚合函数、字符串函数、数值函数、日期和时间函数、控制流函数等。
93 1
Mysql(5)—函数
|
3月前
|
关系型数据库 MySQL
MySQL查看连接数和进程信息
这篇文章介绍了如何在MySQL中查看连接数和进程信息,包括当前打开的连接数量、历史成功建立连接的次数、连接错误次数、连接超时设置,以及如何查看和终止正在执行的连接进程。
700 10
|
3天前
|
SQL 关系型数据库 MySQL
【MySQL基础篇】盘点MySQL常用四大类函数
本文介绍了MySQL中的四大类常用函数:字符串函数、数值函数、日期函数和流程函数。
【MySQL基础篇】盘点MySQL常用四大类函数
|
18天前
|
SQL 关系型数据库 MySQL
MySQL常见函数第二期,你都用过哪些呢 ?
本期介绍了20个常用的MySQL函数,涵盖日期处理(如CURDATE()、DATE_FORMAT())、数学运算(如ABS()、ROUND())、统计分析(如COUNT()、SUM())等,帮助提高SQL查询效率和数据处理能力。希望对大家的学习有所帮助。
60 7
|
21天前
|
关系型数据库 MySQL
MySQL常见函数第一期,你都用过哪些呢 ?
本期介绍10个常用的MySQL函数:字符串连接(CONCAT)、提取子字符串(SUBSTRING)、获取字符串长度(LENGTH)、转换大小写(UPPER、LOWER)、去除空格(TRIM)、替换字符串(REPLACE)、查找子字符串位置(INSTR)、带分隔符的字符串连接(CONCAT_WS)以及获取当前日期时间(NOW)。
56 8
|
22天前
|
数据采集 关系型数据库 MySQL
MySQL常用函数:IF、SUM等用法
本文介绍了MySQL中常用的IF、SUM等函数及其用法,通过具体示例展示了如何利用这些函数进行条件判断、数值计算以及复杂查询。同时,文章还提到了CASE WHEN语句和其他常用函数,如COUNT、AVG、MAX/MIN等,强调了它们在数据统计分析、数据清洗和报表生成中的重要性。
|
26天前
|
关系型数据库 MySQL 数据处理
【MySQL】函数
MySQL 提供了丰富的函数集,涵盖字符串处理、数值运算、日期时间操作和聚合计算等多个方面。这些函数在日常数据库操作中极为重要,通过合理使用这些函数,可以大大提高数据处理和查询的效率。用户还可以通过自定义函数,扩展 MySQL 的功能以满足特定需求。
30 3
|
28天前
|
关系型数据库 MySQL 数据处理
MySQL函数与约束
MySQL 提供了丰富的函数和强大的约束机制,用于数据处理和完整性维护。通过掌握这些工具,可以有效地管理和分析数据库中的数据,确保数据的一致性和准确性。无论是在日常数据查询中使用内置函数,还是在数据库设计中应用各种约束,都是确保数据库系统稳定、高效运行的关键。希望本文对您理解和应用 MySQL 函数与约束有所帮助。
31 1
|
3月前
|
关系型数据库 Serverless 定位技术
PostgreSQL GIS函数判断两条线有交点的函数是什么?
PostgreSQL GIS函数判断两条线有交点的函数是什么?
316 60
|
1月前
|
关系型数据库 MySQL Serverless
MySQL函数
最常用的MySQL函数,包括聚合函数,字符串函数,日期时间函数,控制流函数等
37 1