开发者社区 > PolarDB开源 > PolarDB 分布式版 > 正文

想问一下大家怎么统计pg库分区表大小呢?

想问一下大家怎么统计pg库分区表大小呢?

展开
收起
古拉古拉 2023-10-07 15:48:37 870 0
9 条回答
写回答
取消 提交回答
  • 要统计 PostgreSQL 数据库中分区表的大小,可以使用以下 SQL 查询语句:

    1. 使用 pg_total_relation_size 函数来计算单个分区表的大小。
    SELECT pg_total_relation_size('schema_name.table_name') AS total_size;
    

    schema_name 替换为实际的模式名称,table_name 替换为实际的分区表名称。

    1. 使用 pg_total_relation_size 函数和 generate_series 函数来计算分区表的总大小。
    SELECT sum(pg_total_relation_size('schema_name.table_name')) AS total_size
    FROM generate_series('start_date'::date, 'end_date'::date, 'interval' => '1 day') AS date;
    

    schema_name 替换为实际的模式名称,table_name 替换为实际的分区表名称。start_dateend_date 替换为实际的开始和结束日期,用于指定要计算大小的分区表的时间范围。

    这些查询语句将返回以字节为单位的分区表大小。如果需要以更直观的方式表示,也可以将结果转换为其他更常用的大小单位(如 KB、MB 或 GB)。

    请注意,以上查询语句假定分区表是通过 PostgreSQL 的原生分区功能来创建的。如果是使用第三方扩展或其他方式实现的分区表,可能需要采用不同的方法来计算分区表大小。

    此外,还可以使用工具如 pg_size_pretty() 函数来将大小转换为更直观的格式。

    SELECT pg_size_pretty(pg_total_relation_size('schema_name.table_name')) AS total_size;
    

    这将返回适合人们阅读的格式化大小,例如 1 GB500 MB

    2023-10-11 21:06:51
    赞同 展开评论 打赏
  • 北京阿里云ACE会长

    SELECT SUM(size) as total_size FROM information_schema.partitions WHERE table_schema = 'your_schema' AND table_name = 'your_table';
    这个查询语句将返回指定表的分区大小总和。请注意,您需要将your_schema和your_table替换为实际的 schema 和表名。
    使用 pg_size_pretty 函数:除了使用 SQL 查询外,您还可以使用 pg_size_pretty 函数来将以字节为单位的表大小转换为更易读的格式。例如:

    SELECT pg_size_pretty(SUM(size)) as total_size FROM information_schema.partitions WHERE table_schema = 'your_schema' AND table_name = 'your_table';
    CopyCopy

    这个查询将返回一个字符串,表示分区表的总大小。请注意,您需要将your_schema和your_table替换为实际的 schema 和表名。
    使用分区相关的扩展:如果您使用的是 PostgreSQL 12 及更高版本,您可以使用分区相关的扩展(如 pg_partition_size)来更方便地查询分区表大小。具体的扩展使用方法可以参考 PostgreSQL 官方文档。

    2023-10-08 07:37:54
    赞同 展开评论 打赏
  • pg库分区表大小可以通过以下方法进行统计:

    1. 使用SQL查询:可以使用SQL查询来统计分区表的大小。具体的查询语句可以根据表的结构和分区方式来编写,例如:
    SELECT pg_total_relation_size('table_name');
    

    其中,'table_name'是需要统计大小的分区表的名称。

    1. 使用pgstattuple函数:pgstattuple函数可以返回表或索引中行的详细统计信息,包括表的大小。可以使用以下查询来统计分区表的大小:
    SELECT pgstattuple('table_name')::pgstattuple;
    

    其中,'table_name'是需要统计大小的分区表的名称。

    1. 使用第三方工具:也可以使用第三方工具来统计分区表的大小,例如pgAdmin、pgAdmin III等。这些工具通常提供了直观的界面和易于使用的功能,可以方便地统计分区表的大小。

    注意:在使用这些方法时,需要确保具有足够的权限来访问需要统计大小的分区表。

    2023-10-07 22:29:12
    赞同 展开评论 打赏
  • WITH RECURSIVE inheritance_tree AS (
    SELECT c.oid AS table_oid
    , c.relname AS table_name
    , n.nspname AS schema_name
    , NULL::name AS table_parent_name
    , c.relispartition AS is_partition
    FROM pg_class c
    JOIN pg_namespace n ON n.oid = c.relnamespace
    WHERE c.relkind = 'p'
    AND c.relispartition = false
    UNION ALL
    SELECT inh.inhrelid AS table_oid
    , c.relname AS table_name
    , n.nspname AS schema_name
    , cc.relname AS table_parent_name
    , c.relispartition AS is_partition
    FROM inheritance_tree it
    JOIN pg_inherits inh ON inh.inhparent = it.table_oid
    JOIN pg_class c ON inh.inhrelid = c.oid
    JOIN pg_class cc ON it.table_oid = cc.oid
    JOIN pg_namespace n ON c.relnamespace = n.oid
    )
    SELECT
    it.table_name
    , it.schema_name
    , c.reltuples
    , c.relpages
    , CASE p.partstrat
    WHEN 'l' THEN 'BY LIST'
    WHEN 'r' THEN 'BY RANGE'
    ELSE 'not partitioned'
    END AS partitionin_type
    , it.table_parent_name
    , pg_get_expr( c.relpartbound, c.oid, true ) AS partitioning_values
    , pg_get_expr( p.partexprs, c.oid, true ) AS sub_partitioning_values
    FROM inheritance_tree it
    JOIN pg_class c ON c.oid = it.table_oid
    LEFT JOIN pg_partitioned_table p ON p.partrelid = it.table_oid
    ORDER BY 1,2;

    WITH RECURSIVE tables AS (
    SELECT
    c.oid AS parent,
    c.oid AS relid,
    1 AS level
    FROM
    pg_catalog.pg_class c
    LEFT JOIN pg_catalog.pg_inherits AS i ON c.oid = i.inhrelid
    -- p = partitioned table, r = normal table
    WHERE
    c.relkind IN ('p', 'r')
    -- not having a parent table -> we only get the partition heads
    AND i.inhrelid IS NULL
    UNION ALL
    SELECT
    p.parent AS parent,
    c.oid AS relid,
    p.level + 1 AS level
    FROM
    tables AS p
    LEFT JOIN pg_catalog.pg_inherits AS i ON p.relid = i.inhparent
    LEFT JOIN pg_catalog.pg_class AS c ON c.oid = i.inhrelid
    AND c.relispartition
    WHERE
    c.oid IS NOT NULL
    )
    SELECT
    parent::regclass AS table_name,
    array_agg(relid::REGCLASS) AS all_partitions,
    pg_size_pretty(sum(pg_total_relation_size(relid))) AS pretty_total_size,
    sum(pg_total_relation_size(relid)) AS total_size
    FROM
    tables
    where parent = 'ptab01'::regclass GROUP BY
    parent;

    此答案来自钉钉群“PG|POLARDB技术进阶”

    2023-10-07 22:18:29
    赞同 展开评论 打赏
  • 十分耕耘,一定会有一分收获!

    楼主你好,根据你的描述,我知道的2种方式来统计阿里云PG库分区表大小:

    方式1. 使用PGAdmin III工具进行统计:

    • 在PGAdmin III工具中连接至您的数据库实例。
    • 在左侧目录栏中选中您的分区表,并右键选择“属性”。
    • 在“属性”窗口中,选择“统计”选项卡,即可看到该分区表的大小、行数、索引大小等信息。

    方式2. 使用SQL语句进行统计:

    • 登录到您的数据库实例。
    • 执行以下SQL语句,将其中的“table_name”替换成您要统计的分区表名称:
      image.png
    SELECT relname AS tablename, pg_total_relation_size(relid::regclass)/1024/1024 AS tablesize_mb
    FROM pg_catalog.pg_statio_user_tables
    WHERE relname = 'table_name';
    
    • 执行以上SQL语句后,你将会得到该分区表的大小(以MB为单位)。

    你可以根据这两种方式试试效果。

    2023-10-07 19:34:28
    赞同 1 展开评论 打赏
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    在PostgreSQL中,可以使用pg_total_relation_size函数来统计分区表的大小。这个函数返回一个表的总大小,包括所有分区和它们的数据。如果你想只统计某个分区的大小,可以使用pg_partition_size函数。
    另外,如果分区表有多个级别,可以使用递归查询来统计所有分区的大小。例如,以下查询可以统计一个名为my_table的分区表中所有分区的大小:

    SELECT 
        nspname || '.' || relname AS partition_name,
        pg_total_relation_size(nspname || '.' || relname) AS partition_size
    FROM 
        pg_class
    JOIN 
        pg_namespace ON pg_namespace.oid = pg_class.relnamespace
    WHERE 
        pg_class.relkind = 'p' AND 
        pg_class.relname = 'my_table'
    UNION ALL 
    SELECT 
        nspname || '.' || relname AS partition_name,
        pg_total_relation_size(nspname || '.' || relname) AS partition_size
    FROM 
        pg_class
    JOIN 
        pg_namespace ON pg_namespace.oid = pg_class.relnamespace
    JOIN 
        pg_partition ON pg_partition.parrelid = pg_class.oid
    WHERE 
        pg_class.relkind = 'p' AND 
        pg_partition.parrelid IN (
            SELECT 
                inhrelid 
            FROM 
                pg_inherits 
            WHERE 
                inhparent = (
                    SELECT 
                        oid 
                    FROM 
                        pg_class 
                    WHERE 
                        relname = 'my_table'
                )
        )
    

    这个查询首先找到my_table的分区,然后递归地找到所有下级分区,最后统计所有分区的大小。

    2023-10-07 17:07:24
    赞同 展开评论 打赏
  • 统计PostgreSQL数据库(pg库)分区表的大小,可以使用以下方法:

    1. 使用pg_class表进行查询。首先,连接到PostgreSQL数据库,然后执行以下SQL查询语句:
    SELECT relpages * 8 / 1024 || 'M' as 占用空间, reltuples 记录数
    FROM pg_class
    WHERE relname = 'your_table_name';
    

    your_table_name替换为要查询的表名。执行这个查询后,将返回一个结果,其中包含该表所占用的空间大小和记录数。

    1. 使用psql命令行工具。如果你已经安装了psql工具,可以通过以下命令连接到数据库:
    psql -U username -d database_name
    

    其中,username是你的数据库用户名,database_name是要连接的数据库名。连接成功后,输入以下命令来列出指定表的大小信息:

    \dt+ your_table_name
    

    your_table_name替换为要查询的表名。执行这个命令后,将返回一个结果集,其中包含表的详细信息,包括大小。

    2023-10-07 16:40:21
    赞同 2 展开评论 打赏
  • 月移花影,暗香浮动

    楼主不好,可以使用以下SQL语句来统计pg库分区表大小:

    SELECT relname, pg_size_pretty(pg_total_relation_size(C.oid)) AS total_size
    FROM pg_class C
    LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
    WHERE nspname NOT IN ('pg_catalog', 'information_schema') AND relkind = 'S'
    ORDER BY total_size DESC;
    
    2023-10-07 16:13:01
    赞同 展开评论 打赏
  • 在PostgreSQL中,你可以使用pg_size_pretty()函数来统计分区表的大小。这个函数会将大小以人类可读的形式返回。

    以下是具体的查询示例:

    SELECT pg_size_pretty(sum(pg_column_size(your_table_name))) 
    FROM your_table_name;
    

    在这个查询中,pg_column_size(your_table_name)会返回每个分区的大小,sum()函数会返回所有分区大小的总和,最后pg_size_pretty()会将总大小以人类可读的形式返回。

    请将your_table_name替换为你的实际分区表名。

    2023-10-07 15:52:23
    赞同 2 展开评论 打赏
滑动查看更多

PolarDB 分布式版 (PolarDB for Xscale,简称“PolarDB-X”) 是阿里云自主设计研发的高性能云原生分布式数据库产品,为用户提供高吞吐、大存储、低延时、易扩展和超高可用的云时代数据库服务。

相关电子书

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