开发者社区 > 数据库 > 数据仓库 > 正文

数据治理中,查膨胀比的命令是啥?

已解决

各位大佬,

麻烦帮忙解答一下哇;

SELECT * FROM gp_toolkit.gp_bloat_diag;
这个命令是只会显示膨胀比大于3的表吗?
如果我要查询膨胀比大于1的表怎么写呢?
还有就是如果要查询膨胀比大于1,并且表数据大于1TB的表怎么写呢?

展开
收起
萌新团团长凯文 2024-01-11 11:02:14 116 0
2 条回答
写回答
取消 提交回答
  • 采纳回答

    SELECT * FROM gp_toolkit.gp_bloat_diag; 这个命令会显示Greenplum数据库中所有存在膨胀(bloat)的表的信息,但并不一定只显示膨胀比大于3的表。膨胀比通常是通过 bdirelpages(实际占用的页面数)和 bdiexppages(预期需要的页面数)来判断的,当 bdirelpages / bdiexppages 的值大于某个阈值时认为表存在膨胀现象。

    如果要查询膨胀比大于1的表,你可以按照以下方式编写SQL:

    SELECT *
    FROM gp_toolkit.gp_bloat_diag
    WHERE bdirelpages > bdiexppages;
    

    不过,为了更精确地计算膨胀比并筛选出膨胀比例大于1的表,应该这样写:

    SELECT *
    FROM gp_toolkit.gp_bloat_diag
    WHERE bdirelpages / bdiexppages > 1;
    

    至于同时要求表数据大小大于1TB,由于gp_toolkit视图中可能没有直接提供表数据大小的列,你可能需要结合其他系统视图或函数来估算表的数据量。假设我们可以获取到每个表的大致行数以及平均行长度来估计表大小,可以尝试构造如下查询(这里假设了一个名为 estimate_table_size 的自定义函数用于估算表大小):

    CREATE OR REPLACE FUNCTION estimate_table_size(schema_name text, table_name text)
    RETURNS bigint AS $$
    DECLARE
        row_count bigint;
        avg_row_length real;
    BEGIN
        -- 获取表的行数与平均行长度,此处为示例,实际逻辑可能需要根据Greenplum的具体函数实现
        SELECT reltuples INTO row_count FROM pg_class WHERE relname = table_name AND relnamespace IN (
            SELECT oid FROM pg_namespace WHERE nspname = schema_name
        );
    
        -- 假设有一个函数可以计算平均行长度
        SELECT some_function_to_calculate_avg_row_length(table_name) INTO avg_row_length;
    
        RETURN row_count * avg_row_length / (1024 * 1024 * 1024 * 1024); -- 转换为GB
    END;
    $$ LANGUAGE plpgsql;
    
    -- 查询膨胀比大于1且表大小估计超过1TB的表
    SELECT *
    FROM gp_toolkit.gp_bloat_diag gpd
    JOIN (
        SELECT schemaname, tablename, estimate_table_size(schemaname, tablename) AS size_in_gb
        FROM pg_tables
        WHERE schemaname NOT LIKE 'pg_%' AND schemaname != 'information_schema'
    ) est ON gpd.bdirelname = quote_ident(est.schemaname) || '.' || quote_ident(est.tablename)
    WHERE bdirelpages / bdiexppages > 1 AND size_in_gb > 1024; -- 转换成GB进行比较
    

    请注意,上述查询仅为示例,实际上Greenplum中可能并没有现成的函数可以直接计算表的实际大小至GB级别,并且对于大规模分布式数据库,直接估算表大小可能会相当复杂,通常需要考虑行分布、压缩等因素

    2024-01-11 13:30:43
    赞同 2 展开评论 打赏
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。
    1. 是的,这个命令只会显示膨胀比大于3的表。如果你想要查询膨胀比大于1的表,可以将3改为1。

    2. 要查询膨胀比大于1的表,可以使用以下SQL语句:

    SELECT * FROM gp_toolkit.gp_bloat_diag WHERE bloat_ratio > 1;
    
    1. 要查询膨胀比大于1,并且表数据大于1TB的表,可以使用以下SQL语句:
    SELECT * FROM gp_toolkit.gp_bloat_diag WHERE bloat_ratio > 1 AND size > 1024 * 1024 * 1024 * 1024;
    
    2024-01-11 13:47:30
    赞同 展开评论 打赏

阿里云自主研发的云原生数据仓库,具有高并发读写、低峰谷读写、弹性扩展、安全可靠等特性,可支持PB级别数据存储,可广泛应用于BI、机器学习、实时分析、数据挖掘等场景。包含AnalyticDB MySQL版、AnalyticDB PostgreSQL 版。

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载