如何获取数据库中所有表的FreeSpace总和

How to get the sum of FreeSpace of all the tables in a database

获取数据库中的所有用户 Table 名称使用:

select relname from pg_stat_user_tables;

relname
-------
Table1
Table2
Table3

要获得一个 table 真空标记的免费 space 使用:

SELECT sum(avail) FROM pg_freespace('Table1');

sum
-----
1728

我想在单个查询中获得所有 table 的总免费 space。

比如说,

Table1 has 1728 freespace
Table2 has 100 freespace
Table3 has 100 freespace

如何将 1928 作为查询的答案?

我建议你先通过一个table list all table in database 比如pg_table 来查询,然后再求和。比如下面的 2 个查询: 1. 列出所有 table 及其可用空间:

SELECT fulltablename, sum(avail) as freespace
FROM (
    SELECT concat(schemaname,'.',tablename) as fulltablename, (pg_freespace(concat(schemaname,'.',tablename))).* 
      FROM pg_tables 
    ) t
GROUP BY fulltablename
  1. 汇总数据库中的所有可用空间:
SELECT sum(avail) as freespace
FROM (
    SELECT concat(schemaname,'.',tablename) as fulltablename, (pg_freespace(concat(schemaname,'.',tablename))).* 
      FROM pg_tables 
    ) t

希望这个回答能让您满意

我使用以下查询来解决我的问题(获取我架构的所有 table 的可用空间总和)

SELECT sum(avail) as freespace
FROM (
    SELECT  (pg_freespace(concat(schemaname,'."',tablename,'"'))).* 
    FROM pg_tables where schemaname = 'mySchema'
) t
;

我调整了 Mabu 的 sql 为所有表提供了一个总可用空间值

SELECT sum(freespace) as TotalFreeSpace
FROM (
    SELECT fulltablename, sum(avail) as freespace
    FROM (
        SELECT concat(schemaname,'.',tablename) as fulltablename, 
        (pg_freespace(concat(schemaname,'.',tablename))).*
        FROM pg_tables
        ) t
    GROUP BY fulltablename) f