文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

PostgreSQL12的pg_partition_tree和pg_partition_root系统函数有什么作用

2024-04-02 19:55

关注

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

在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系统函数有什么作用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯