You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用单条查询语句获取数据库所有表的FreeSpace总和

解决方案:单条SQL计算所有用户表的VACUUM标记空闲空间总和

要实现这个需求,我们可以通过嵌套查询+动态调用pg_freespace函数的方式,遍历所有用户表并聚合它们的空闲空间总和。以下是具体的SQL语句:

基础版本(适用于单schema场景)

SELECT SUM(free_space) AS total_free_space
FROM (
    -- 对每个用户表调用pg_freespace计算单表空闲空间
    SELECT (SELECT SUM(avail) FROM pg_freespace(relname::regclass)) AS free_space
    FROM pg_stat_user_tables
) AS table_free_spaces;

增强版本(处理跨schema+NULL值)

如果你的用户表分布在不同schema下,或者存在某些表没有空闲空间(此时pg_freespace会返回NULL),可以用下面更严谨的写法:

SELECT SUM(COALESCE(free_space, 0)) AS total_free_space
FROM (
    SELECT (
        SELECT SUM(avail) 
        FROM pg_freespace((relnamespace::regnamespace || '.' || relname)::regclass)
    ) AS free_space
    FROM pg_stat_user_tables
) AS table_free_spaces;

关键细节解释

  1. relname::regclass:把表名字符串转换成PostgreSQL的regclass类型,确保数据库能正确识别表(自动处理表名大小写、特殊字符等问题)。
  2. 跨schema处理:relnamespace::regnamespace会把schema的OID转换成schema名称,拼接成schema.table格式的完整表名,避免同名表的冲突。
  3. COALESCE(free_space, 0):如果某个表没有被VACUUM标记的空闲空间,pg_freespace会返回NULL,用COALESCE把NULL替换为0,保证总和计算准确。

验证你的例子

对于你提到的Table1(1728)、Table2(100)、Table3(100),执行上面的SQL后,内层查询会生成三个值:1728、100、100,外层的SUM会直接得到总和1928,完全符合你的需求。

内容的提问来源于stack exchange,提问作者Anushiya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:43:20