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

时间:2018-01-20 06:38:25

标签: postgresql vacuum

使用以下方法获取数据库中的所有用户表名称:

select relname from pg_stat_user_tables;

relname
-------
Table1
Table2
Table3

使用以下方法获取一个表标记为真空的可用空间:

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

sum
-----
1728

我希望在单个查询中获得所有表的总可用空间。

比如说,

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

如何通过查询获得1928作为答案?

3 个答案:

答案 0 :(得分:0)

我建议您可以先通过表格列表查询数据库中的所有表格,例如pg_table,然后将其全部加以总结。如下2个查询: 1.列出所有表及其自由空间:

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. 汇总数据库中的所有自由空间:
  2. SELECT sum(avail) as freespace
    FROM (
        SELECT concat(schemaname,'.',tablename) as fulltablename, (pg_freespace(concat(schemaname,'.',tablename))).* 
          FROM pg_tables 
        ) t
    

    我希望这个答案能让你满意。

答案 1 :(得分:0)

我使用下面的查询来解决我的问题(获取我的架构的所有表的自由空间的总和)

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

答案 2 :(得分:0)

我已经调整了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