Greenplum PSQL动态查询格式



首先,提前感谢您对我下面这个相对简单的问题的帮助。这真的快把我逼疯了!

简单地说,我试图在一个模式中的所有表上选择一些指标。然而,这特别包括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');

最新更新