パーティションを含むすべてのテーブルの合計サイズを取得する簡単な方法はありますか?私は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バージョンを使用して自由に投稿してください。
ここに私が持っているものがありますが、それも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