首先,提前感谢您对我下面这个相对简单的问题的帮助。这真的快把我逼疯了!
简单地说,我试图在一个模式中的所有表上选择一些指标。然而,这特别包括Greenplum中的Partitioned表(对于那些不了解它的人来说,它有一个名为X的父表,然后有一个名为X_1_prt_3, X_1_prt_4等的子表)。
因此,我的查询试图获得单个分区表X的总表大小,如下所示:
-- Part 1
select cast(sum(sotaidtablesize) as bigint) / 1024 / 1024 as "Table Size (MB)"
from gp_toolkit.gp_size_of_table_and_indexes_disk
where sotaidschemaname = 'Y'
and sotaidtablename like 'X%'
;
这总结了任何名为X或类似的表的表大小,这实际上是我想要的。但这只是一个更大问题的一部分…我不想指定模式和表,我希望是:
-- Part 2
where sotaidschemaname = t4.nspname
and sotaidtablename like 't4.relname%'
但遗憾的是,这并不能正常工作(这将是一个多么美好的世界!!)我已经尝试了以下,我认为是接近的,但我不能让它返回NULL以外的任何值:
-- Part 3
and sotaidtablename like quote_literal(format( '%I', tablename )::regclass)
其中tablename是来自另一部分的列(我已经以另一种正确工作的格式使用该列,所以我知道这一点特别不是问题)。
提前感谢任何人的任何帮助!
问候,文尼
我发现在连接子句上使用gp_size_of_table_and_indexes_disk.sotaidoid
比使用(sotaidschemaname, sotaidtablename)
更容易。
例如:
SELECT pg_namespace.nspname AS schema,
pg_class.relname AS relation,
pg_size_pretty(sotd.sotdsize::BIGINT) as tablesize,
pg_size_pretty(sotd.sotdtoastsize::BIGINT) as toastsize,
pg_size_pretty(sotd.sotdadditionalsize::BIGINT) as othersize,
pg_size_pretty(sotaid.sotaidtablesize::BIGINT) as tabledisksize,
pg_size_pretty(sotaid.sotaididxsize::BIGINT) as indexsize
FROM pg_class
LEFT JOIN pg_stat_user_tables
ON pg_stat_user_tables.relid = pg_class.oid
LEFT JOIN gp_toolkit.gp_size_of_table_disk sotd
ON sotd.sotdoid = pg_class.oid
LEFT JOIN gp_toolkit.gp_size_of_table_and_indexes_disk sotaid
ON sotaid.sotaidoid = pg_class.oid
LEFT JOIN pg_namespace
ON pg_namespace.oid = pg_class.relnamespace
WHERE
pg_class.relkind = 'r'
AND relstorage != 'x'
AND pg_namespace.nspname NOT IN ('information_schema', 'madlib', 'pg_catalog', 'gptext')
AND pg_class.relname NOT IN ('spatial_ref_sys');