with recursive t (inhrelid, inhparent, depth) 
as (
        select  inhrelid, inhparent, 1 
        from    pg_inherits pi
        union all
        select  pi.inhrelid, pi.inhparent, depth + 1
        from    t, pg_inherits pi
        where   pi.inhparent = t.inhrelid
)
select pa.rolname,
       (select relname from pg_class where oid = pi.inhparent) as table_name,
       pcs.relname as partition_name,
       pt.spcname as tablespace_name,
       case ppt.partstrat when 'l' then 'list' when 'r' then 'range' else 'not partition' end as partition_type,
       dr.DEGREE,
       pc.reltuples::int as row_nums,
       pg_size_pretty(pg_table_size(pc.oid)) as size,
       pg_get_expr(pc.relpartbound, pc.oid) as partition_value
from    pg_class pcs
join    pg_inherits pi 
        on pc.oid = pi.inhrelid
join    pg_partitioned_table ppt 
        on ppt.partrelid = pi.inhparent
join    pg_authid pa 
        on pc.relowner = pa.oid
join    pg_tablespace pt 
        on pt.oid = case 
                        when pc.reltablespace = 0 
                            then (
                                    select  dattablespace 
                                    from    pg_database 
                                    where   datname=current_database()
                                 )
                        else pc.reltablespace 
                    end
join (
        select inhrelid, inhparent, max(depth) as degree
        from t
        group by inhrelid, inhparent
     ) dr 
     on dr.inhrelid = pc.oid
WHERE   DEGREE='1'
order by degree, table_name, partition_name;
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,