postgresql - PostgreSQL 数据库中具有大小(相对和绝对)的模式列表

标签 postgresql

我正在寻找一个返回任何数据库表单结果的查询(参见下面的示例,假设数据库使用的总空间为 40GB)

schema | size | relative size
----------+-------------------
foo    | 15GB |   37.5%      
bar    | 20GB |     50%
baz    |  5GB |   12.5%

我已经设法使用数据库中按模式排序的实体编制了一个空间列表,这很有用,但从中获取每个模式的摘要看起来并不那么容易。见下文。

SELECT relkind,
       relname,
       pg_catalog.pg_namespace.nspname,
       pg_size_pretty(pg_relation_size(pg_catalog.pg_class.oid))
FROM   pg_catalog.pg_class
       INNER JOIN pg_catalog.pg_namespace
         ON relnamespace = pg_catalog.pg_namespace.oid
ORDER  BY pg_catalog.pg_namespace.nspname,
          pg_relation_size(pg_catalog.pg_class.oid) DESC;

这给出了这样的结果

  relkind |                relname                |      nspname       | pg_size_pretty 
---------+---------------------------------------+--------------------+----------------
  r       | geno                                  | btsnp              | 11 GB
  i       | geno_pkey                             | btsnp              | 5838 MB
  r       | anno                                  | btsnp              | 63 MB
  i       | anno_fid_key                          | btsnp              | 28 MB
  i       | ix_btsnp_anno_rsid                    | btsnp              | 28 MB
  [...]
  r       | anno                                  | btsnp_shard        | 63 MB
  r       | geno4681                              | btsnp_shard        | 38 MB
  r       | geno4595                              | btsnp_shard        | 38 MB
  r       | geno4771                              | btsnp_shard        | 38 MB
  r       | geno4775                              | btsnp_shard        | 38 MB

看起来可能需要使用像 SUM 这样的聚合运算符,但到目前为止还没有成功。

最佳答案

试试这个:

SELECT schema_name, 
       sum(table_size),
       (sum(table_size) / database_size) * 100
FROM (
  SELECT pg_catalog.pg_namespace.nspname as schema_name,
         pg_relation_size(pg_catalog.pg_class.oid) as table_size,
         sum(pg_relation_size(pg_catalog.pg_class.oid)) over () as database_size
  FROM   pg_catalog.pg_class
     JOIN pg_catalog.pg_namespace ON relnamespace = pg_catalog.pg_namespace.oid
) t
GROUP BY schema_name, database_size


编辑:刚刚注意到不需要汇总所有表来获取数据库大小的解决方法:

SELECT schema_name, 
       pg_size_pretty(sum(table_size)::bigint),
       (sum(table_size) / pg_database_size(current_database())) * 100
FROM (
  SELECT pg_catalog.pg_namespace.nspname as schema_name,
         pg_relation_size(pg_catalog.pg_class.oid) as table_size
  FROM   pg_catalog.pg_class
     JOIN pg_catalog.pg_namespace ON relnamespace = pg_catalog.pg_namespace.oid
) t
GROUP BY schema_name
ORDER BY schema_name

关于postgresql - PostgreSQL 数据库中具有大小(相对和绝对)的模式列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4418403/

相关文章:

sql - 结果集行的平均值

sql - Postgres : convert single row to multiple rows (unpivot)

postgresql - 如何在 Postgres 同步复制中禁用未提交的读取?

database - 使用存储过程模拟 postgresql

perl - PL/Perl 在 Postgresql 中发送邮件

postgresql - 如何将 NULL 值插入 PostgreSQL 表

sql - 使用 Postgres 聚合函数选择每个 GROUP BY 组中的第一行?

postgresql - 错误 : value seq is not a member of object slick. dbio.DBIO

postgresql - Alter Table Set Statistics 需要表锁

sql - 从 plpgsql 函数返回一个选择