获取PostgreSQL数据库中的分区数

6

如何最有效地获取数据库中创建的分区数?

我正在使用C++的PostgreSQL API。

2个回答

13

这是如何选择表分区所有名称的方法:

SELECT
    nmsp_parent.nspname AS parent_schema,
    parent.relname      AS parent,
    nmsp_child.nspname  AS child,
    child.relname       AS child_schema
FROM pg_inherits
    JOIN pg_class parent        ON pg_inherits.inhparent = parent.oid
    JOIN pg_class child         ON pg_inherits.inhrelid   = child.oid
    JOIN pg_namespace nmsp_parent   ON nmsp_parent.oid  = parent.relnamespace
    JOIN pg_namespace nmsp_child    ON nmsp_child.oid   = child.relnamespace

它还可以用来计数:

SELECT
    nmsp_parent.nspname     AS parent_schema,
    parent.relname          AS parent,
    COUNT(*)
FROM pg_inherits
    JOIN pg_class parent        ON pg_inherits.inhparent = parent.oid
    JOIN pg_class child     ON pg_inherits.inhrelid   = child.oid
    JOIN pg_namespace nmsp_parent   ON nmsp_parent.oid  = parent.relnamespace
    JOIN pg_namespace nmsp_child    ON nmsp_child.oid   = child.relnamespace
GROUP BY
    parent_schema,
    parent;

那么我要如何删除最旧的分区呢?(也就是最先创建的分区?) - Shay
如果最低的OID是最旧的分区,你可以使用MIN(child.oid)来找到这个分区。你可以用它来找到这个表的名称和模式,并用它来删除这个表。使用存储过程可以更容易地进行维护。 - Frank Heikens

8

传统的分区通过继承实现。每个继承表在系统目录pg_inherits中都有一个条目。给定父表的分区数可以简单地计算:

SELECT count(*) AS partitions
FROM   pg_catalog.pg_inherits
WHERE  inhparent = 'schema.parent_tbl'::regclass;

该解决方案也适用于Postgres 10或更高版本中的声明式分区,因为引用手册所说:

各个分区与分区表之间采用继承方式进行链接;

有关dba.SE的相关问题:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接