PostgreSQL12的pg

68次阅读
没有评论

共计 3991 个字符,预计需要花费 10 分钟才能阅读完成。

行业资讯    
数据库    
关系型数据库    
PostgreSQL12 的 pg_partition_tree 和 pg_partition_root 系统函数有什么作用

这篇文章主要介绍“PostgreSQL12 的 pg_partition_tree 和 pg_partition_root 系统函数有什么作用”,在日常操作中,相信很多人在 PostgreSQL12 的 pg_partition_tree 和 pg_partition_root 系统函数有什么作用问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PostgreSQL12 的 pg_partition_tree 和 pg_partition_root 系统函数有什么作用”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!

在 PG 12 以前的版本, 获取分区表中的分区以及子分区等信息需要使用递归 CTE 查询脚本来获取, 不直观而且麻烦, 在 PG 12 中新增了 pg_partition_tree 和 pg_partition_root 系统函数分别用于获取分区树和分区的 root relation.

下面以一个简单的例子进行说明.

测试脚本

-- Hash Partition
drop table if exists t_hash2;
create table t_hash2 (c1 int not null,c2 varchar(40),c3 varchar(40)) partition by hash(c1);
-- Level 1
create table t_hash2_1 partition of t_hash2 for values with (modulus 6,remainder 0) partition by hash(c1);
create table t_hash2_2 partition of t_hash2 for values with (modulus 6,remainder 1) partition by hash(c1);
create table t_hash2_3 partition of t_hash2 for values with (modulus 6,remainder 2);
create table t_hash2_4 partition of t_hash2 for values with (modulus 6,remainder 3);
create table t_hash2_5 partition of t_hash2 for values with (modulus 6,remainder 4);
create table t_hash2_6 partition of t_hash2 for values with (modulus 6,remainder 5);
-- Level 2
create table t_hash2_1_1 partition of t_hash2_1 for values with (modulus 2,remainder 0);
create table t_hash2_1_2 partition of t_hash2_1 for values with (modulus 2,remainder 1);
create table t_hash2_2_1 partition of t_hash2_2 for values with (modulus 2,remainder 0);
create table t_hash2_2_2 partition of t_hash2_2 for values with (modulus 2,remainder 1);

t_hash2 是一张 Hash 分区表, 有 6 个子分区, 其中子分区中的 t_hash2_1 和 t_hash2_2 也是分区表, 分别有 2 个分区.

在 PG 11 中, 需要使用 CTE 递归查询来查询该分区的相关信息:

-- PG11
WITH RECURSIVE partition_info
 (relid, -- oid
 relname, --  名称
 relsize, --  大小
 relispartition, --  是否分区表
 relkind) AS (
 SELECT oid AS relid,
 relname,
 pg_relation_size(oid) AS relsize,
 relispartition,
 relkind
 FROM pg_catalog.pg_class
WHERE relname =  t_hash2  AND --  最顶层的分区表
 relkind =  p  
 UNION ALL
 SELECT
 c.oid AS relid,
 c.relname AS relname,
 pg_relation_size(c.oid) AS relsize,
 c.relispartition AS relispartition,
 c.relkind AS relkind
 FROM partition_info AS p,
 pg_catalog.pg_inherits AS i,
 pg_catalog.pg_class AS c
 WHERE p.relid = i.inhparent AND --  从最顶层的分区表 (即 t_hash2) 开始递归
 c.oid = i.inhrelid AND --  寻找子分区
 c.relispartition --  分区表标记
 )
SELECT * FROM partition_info;
 relid | relname | relsize | relispartition | relkind 
-------+-------------+---------+----------------+---------
 57457 | t_hash2 | 0 | f | p
 57466 | t_hash2_3 | 0 | t | r
 57469 | t_hash2_4 | 0 | t | r
 57472 | t_hash2_5 | 0 | t | r
 57475 | t_hash2_6 | 0 | t | r
 57460 | t_hash2_1 | 0 | t | p
 57463 | t_hash2_2 | 0 | t | p
 57487 | t_hash2_2_2 | 0 | t | r
 57478 | t_hash2_1_1 | 0 | t | r
 57481 | t_hash2_1_2 | 0 | t | r
 57484 | t_hash2_2_1 | 0 | t | r
(11 rows)

而在 PG 12 中, 则可以直接使用系统函数获取相关信息:

testdb=# \sf pg_partition_tree
CREATE OR REPLACE FUNCTION pg_catalog.pg_partition_tree(rootrelid regclass, OUT relid regclass, OUT parentrelid regclass, OUT isleaf boolean, OUT level integer)
 RETURNS SETOF record
 LANGUAGE internal
 PARALLEL SAFE STRICT
AS $function$pg_partition_tree$function$
testdb=# select pg_partition_tree( t_hash2 
 pg_partition_tree 
-----------------------------
 (t_hash2,,f,0)
 (t_hash2_1,t_hash2,f,1)
 (t_hash2_2,t_hash2,f,1)
 (t_hash2_3,t_hash2,t,1)
 (t_hash2_4,t_hash2,t,1)
 (t_hash2_5,t_hash2,t,1)
 (t_hash2_6,t_hash2,t,1)
 (t_hash2_1_1,t_hash2_1,t,2)
 (t_hash2_1_2,t_hash2_1,t,2)
 (t_hash2_2_1,t_hash2_2,t,2)
 (t_hash2_2_2,t_hash2_2,t,2)
(11 rows)

返回的信息包括:
relid – 该分区的 relid
parentrelid – 父分区
isleaf — 是否叶子节点
level — 层次

通过 pg_partition_root 可以获取分区表的 root 节点

testdb=# \sf pg_partition_root
CREATE OR REPLACE FUNCTION pg_catalog.pg_partition_root(regclass)
 RETURNS regclass
 LANGUAGE internal
 IMMUTABLE PARALLEL SAFE STRICT
AS $function$pg_partition_root$function$
testdb=# select pg_partition_root( t_hash2_2_2 
 pg_partition_root 
-------------------
 t_hash2
(1 row)

到此,关于“PostgreSQL12 的 pg_partition_tree 和 pg_partition_root 系统函数有什么作用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-24发表,共计3991字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)