获取分区表的表大小(Postgres 10+)

问题描述 投票:0回答:2

我在Postgres weekly上遇到了这个查询,它显示了表格,它们的大小,吐司大小和索引大小(以字节为单位):

SELECT
  relname AS table_name,
  pg_size_pretty(pg_total_relation_size(relid)) AS total,
  pg_size_pretty(pg_relation_size(relid)) AS internal,
  pg_size_pretty(pg_table_size(relid) - pg_relation_size(relid)) AS external,
  pg_size_pretty(pg_indexes_size(relid)) AS indexes
FROM pg_catalog.pg_statio_user_tables 
ORDER BY pg_total_relation_size(relid) DESC;

我知道Postgres正在为每个分区创建一个表,所以我分别为每个分区获取条目,但是有没有办法在每个表中获得一行,无论该表是否已分区?

postgresql postgresql-10 postgresql-11
2个回答
1
投票

当然,但你必须加入一堆其他目录表并使用GROUP BY

  • 来自他的目录relkind的属性pg_class将告诉你关系是否被分区(p)或不是(r)。
  • 目录pg_inherits将告诉您哪个分区(inhrelid)属于哪个分区表(inhparent)。

由于可以再次对分区进行分区,因此如果要覆盖所有基础,则必须编写递归公用表表达式。


1
投票

按照@Laurenz Albe的指示,我创建了一个满足我需求的查询。这将从特定数据库获取所有分区表的总内存。

SELECT
   pi.inhparent::regclass AS parent_table_name, 
   pg_size_pretty(sum(pg_total_relation_size(psu.relid))) AS total,
   pg_size_pretty(sum(pg_relation_size(psu.relid))) AS internal,
   pg_size_pretty(sum(pg_table_size(psu.relid) - pg_relation_size(psu.relid))) AS external, -- toast
   pg_size_pretty(sum(pg_indexes_size(psu.relid))) AS indexes
FROM pg_catalog.pg_statio_user_tables psu
   JOIN pg_class pc ON psu.relname = pc.relname
   JOIN pg_database pd ON pc.relowner = pd.datdba
   JOIN pg_inherits pi ON pi.inhrelid = pc.oid
WHERE pd.datname = :database_name
GROUP BY pi.inhparent
ORDER BY sum(pg_total_relation_size(psu.relid)) DESC;

请注意,在我们有分区分区的情况下,根表不会有一行,但每个父表都有自己的行

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.