问题描述
首先,提前感谢您对我下面相对简单的问题的任何帮助。老实说,这让我发疯了!
简单地说,我正在尝试在模式中的所有表上选择一些指标。然而,这特别包括 Greenplum 中的分区表(对于那些不知道它的人,它有一个名为 X 的父表,然后是名为 X_1_prt_3、X_1_prt_4 等的子表)。
-- 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 是来自另一部分的列(我已经以另一种格式使用了该列,它可以正常工作,所以我知道这不是问题所在)。
预先感谢任何人的帮助!
问候, 文尼
解决方法
我发现在 join 子句上使用 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');