用于动态查询的 Greenplum PSQL 格式

Posted

技术标签:

【中文标题】用于动态查询的 Greenplum PSQL 格式【英文标题】:Greenplum PSQL Format for Dynamic Query 【发布时间】:2021-02-16 16:38:36 【问题描述】:

首先,提前感谢您对我下面相对简单的问题的任何帮助。老实说,这让我发疯了!

简单地说,我正在尝试在架构中的所有表上选择一些指标。但是,这特别包括 Greenplum 中的分区表(对于那些不知道它的人,它有一个名为 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 是来自另一部分的列(我已经以另一种可以正常工作的格式使用此列,所以我知道这不是问题)。

提前感谢任何人的帮助!

问候, 文尼

【问题讨论】:

【参考方案1】:

我发现在连接子句上使用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');

【讨论】:

以上是关于用于动态查询的 Greenplum PSQL 格式的主要内容,如果未能解决你的问题,请参考以下文章

无法在 psql GreenPlum 中分发

使用 psql 和 centos7 进行任何搜索或插入操作时,greenplum 永远挂起

Greenplum同步到Oracle

GreenPlum数据库使用

psql 的替代输出格式

Greenplum匿名代码块错误?