web-dev-qa-db-ja.com

パーティションを含むすべてのPostgresまたはGreenplumテーブルの合計サイズを取得します

パーティションを含むすべてのテーブルの合計サイズを取得する簡単な方法はありますか?私はGreenplumに対してこのクエリを記述しましたが、少し丸められています。

with part_sz as (
  select ts.sotdschemaname sch
       , coalesce(ps.sopaidparenttablename,ts.sotdtablename) tbl
       , coalesce(ps.sopaidpartitiontablesize,ts.sotdsize) part_size
  from gp_toolkit.gp_size_of_table_disk ts
  left join gp_toolkit.gp_size_of_partition_and_indexes_disk ps
  on ts.sotdschemaname = ps.sopaidpartitionschemaname
  and ts.sotdtablename = ps.sopaidpartitiontablename
)
, tbl_sz as (
  select sch, tbl, sum(part_size) total_size
  from part_sz
  group by sch, tbl
)
select sch, tbl, total_size
from tbl_sz
order by total_size desc

GreenplumはPostgres 8.2に基づいて構築されているため、その機能セットを使用するものが理想的ですが、他の読者のために、新しいPostgresバージョンを使用して自由に投稿してください。

1
PhilHibbs

ここに私が持っているものがありますが、それもPG8.2のテストではなく、少しラウンドアバウトです(もうサポートされていません;))が、schema.tablename、PrettySize(最初の選択)とパーティション化されたテーブルが1つにグループ化されています(ParentTablename)( 2番目の選択)。それはおそらく最良の解決策ではありません(チューニングへようこそ)

--get all tables sizes and group partitioned tables by PartenTablename
SELECT nspname || '.' || relname AS "relation",
       pg_size_pretty(pg_total_relation_size(C.oid)) AS "total_size"
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
LEFT OUTER JOIN pg_inherits I ON (C.relfilenode = I.inhrelid OR C.relfilenode = I.inhparent)
WHERE nspname NOT IN ('pg_catalog', 'information_schema')
    AND C.relkind <> 'i'
    AND nspname !~ '^pg_toast'
    AND I.inhrelid is null
UNION ALL
select nspname || '.' || relname AS "relation", 
       pg_size_pretty(sum(pg_relation_size(inhrelid))) AS "total_size" 
FROM pg_inherits  I 
LEFT JOIN pg_class C ON (C.oid = I.inhparent)
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)  
GROUP BY  nspname,relname
ORDER BY 1,2 
4
Patrick7