PG数据库中表所占用空间大小查询

本文介绍了如何使用SQL查询PostgreSQL中数据库、表及其索引的磁盘空间占用情况,包括查看所有表、单个表、数据库和表空间的大小,并提供了以不同单位显示大小的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 查看所有表所占磁盘空间大小
select sum(t.size) from (
SELECT table_schema || '.' || table_name AS table_full_name, pg_total_relation_size('"' || table_schema || '"."' || table_name || '"')AS size
FROM information_schema.tables
ORDER BY
pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') DESC
) t
  • 查看每个表所占用磁盘空间大小
SELECT table_schema || '.' || table_name AS table_full_name, pg_total_relation_size('"' || table_schema || '"."' || table_name || '"')AS size
FROM information_schema.tables
ORDER BY
pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') DESC
  • 查看数据库大小
playboy=> \l                       //\加上字母l,相当于mysql的,mysql> show databases;  
        List of databases  
   Name    |  Owner   | Encoding  
-----------+----------+----------  
 playboy   | postgres | UTF8  
 postgres  | postgres | UTF8  
 template0 | postgres | UTF8  
 template1 | postgres | UTF8  
  
playboy=> select pg_database_size('playboy');    //查看playboy数据库的大小  
 pg_database_size  
------------------  
          3637896  
(1 row)  
  
playboy=> select pg_database.datname, pg_database_size(pg_database.datname) AS size from pg_database;    //查看所有数据库的大小  
  datname  |  size  
-----------+---------  
 postgres  | 3621512  
 playboy   | 3637896  
 template1 | 3563524  
 template0 | 3563524  
(4 rows)  
  
playboy=> select pg_size_pretty(pg_database_size('playboy'));      //以KB,MB,GB的方式来查看数据库大小  
 pg_size_pretty  
----------------  
 3553 kB  
(1 row)  
  • 查看表大小
playboy=> \d test;                 //相当于mysql的,mysql> desc test;  
            Table "public.test"  
 Column |         Type          | Modifiers  
--------+-----------------------+-----------  
 id     | integer               | not null  
 name   | character varying(32) |  
Indexes: "playboy_id_pk" PRIMARY KEY, btree (id)  
  
playboy=> select pg_relation_size('test');   //查看表大小  
 pg_relation_size  
------------------  
                0  
(1 row)  
  
playboy=> select pg_size_pretty(pg_relation_size('test'));   //以KB,MB,GB的方式来查看表大小  
 pg_size_pretty  
----------------  
 0 bytes  
(1 row)  
  
playboy=> select pg_size_pretty(pg_total_relation_size('test'));   //查看表的总大小,包括索引大小  
 pg_size_pretty  
----------------  
 8192 bytes  
(1 row)  
  • 查看所有所占磁盘空间大小
playboy=> \di                      //相当于mysql的,mysql> show index from test;  
                List of relations  
 Schema |     Name      | Type  |  Owner  | Table  
--------+---------------+-------+---------+-------  
 public | playboy_id_pk | index | playboy | test  
(1 row)  
  
playboy=> select pg_size_pretty(pg_relation_size('playboy_id_pk'));    //查看索大小  
 pg_size_pretty  
----------------  
 8192 bytes  
(1 row)  
  • 查看表空间大小
playboy=> select spcname from pg_tablespace;         //查看所有表空间  
  spcname  
------------  
 pg_default  
 pg_global  
(2 rows)  
  
playboy=> select pg_size_pretty(pg_tablespace_size('pg_default'));   //查看表空间大小  
 pg_size_pretty  
----------------  
 14 MB  
(1 row)  
<think>首先,用户的问题是:查询PostgreSQL数据库中表空间大小,并按大小排序。具体是“查询占用空间大小大小排序”。 我需要参考提供的引用内容,因为它们提供了相关信息。让我回顾一下引用: - 引用[1]:讨论了PostgreSQL空间用分析和执行计划,但没有直接给出查询大小的SQL。 - 引用[2]:提供了查询单个占用空间的SQL: - 对于单个:`select relpages*8/1024||'M' as 占用空间,reltuples 记录数 from pg_class where relname='名';` - 对于所有数据库:`select pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS size from pg_database` - 对于特定数据库下的占用空间排序:`SELECT table_schema || '.' || table_name AS table_full_name, pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') AS size FROM information_schema.tables WHERE table_schema = 'public' ORDER BY size DESC` - 引用[3]:强调了了解空间用的重要性,但未提供具体SQL。 - 引用[4]:讨论了空间管理,但没有查询SQL。 - 引用[5]:提供了查询大小的SQL,包括数据大小、索引大小和总大小: - `SELECT table_name, pg_size_pretty(table_size) AS table_size, pg_size_pretty(indexes_size) AS indexes_size, pg_size_pretty(total_size) AS total_size FROM ( SELECT table_name, pg_table_size(table_name) AS table_size, pg_indexes_size(table_name) AS indexes_size, pg_total_relation_size(table_name) AS total_size FROM ( SELECT ('"' || table_schema || '"."' || table_name || '"') AS table_name FROM information_schema.tables ) AS all_tables ORDER BY total_size DESC ) AS pretty_sizes` 用户的问题是查询占用空间大小并按大小排序。引用[2]和[5]提供了相关SQL。 用户指定了“空间大小”,但在PostgreSQL中,“空间”通常指的是tablespace,而用户可能指的是占用空间大小。从上下文看,用户是想查询每个用的磁盘空间大小。 在引用[2]中,有查询特定数据库下的占用空间排序的SQL: `SELECT table_schema || '.' || table_name AS table_full_name, pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') AS size FROM information_schema.tables WHERE table_schema = 'public' ORDER BY size DESC` 在引用[5]中,有更详细的查询,包括数据大小、索引大小和总大小。 我应该提供一个完整的SQL查询,满足用户需求:查询所有占用空间大小,并按大小降序排序。 最佳实践是使用`pg_total_relation_size`函数来获取的总大小(包括索引和TOAST数据),并使用`pg_size_pretty`来格式化输出为易读的格式。 SQL查询可以是: ```sql SELECT table_schema || '.' || table_name AS table_name, pg_size_pretty(pg_total_relation_size('"' || table_schema || '"."' || table_name || '"')) AS total_size FROM information_schema.tables WHERE table_schema NOT IN ('pg_catalog', 'information_schema') -- 排除系统 ORDER BY pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') DESC; ``` 或者,更简洁的版本,使用别名: ```sql SELECT table_schema || '.' || table_name AS table_name, pg_size_pretty(pg_total_relation_size(table_schema || '.' || table_name)) AS total_size FROM information_schema.tables WHERE table_schema NOT IN ('pg_catalog', 'information_schema') ORDER BY pg_total_relation_size(table_schema || '.' || table_name) DESC; ``` 在引用[5]中,使用了`('"' || table_schema || '"."' || table_name || '"')`来确保名被正确引用,这在名有特殊字符时很重要。所以最好使用双引号。 现在,回答结构需要清晰: 1. 解释如何查询。 2. 提供SQL示例。 3. 解释SQL的含义。 4. 自然地添加引用标识。 另外,根据系统指令: - 行内数学达式用$...$,但这里可能不需要。 - 独立公式用$$...$$,但这里没有数学公式。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾添加引用标识。 相关问题可以基于用户查询,比如: 1. 如何查询索引占用空间? 2. 如何释放未使用的空间? 3. 如何优化空间使用? 最后,确保回答真实可靠,基于提供的引用。 完整回答结构: - 引言:介绍查询空间大小的重要性。 - 方法:提供SQL查询并解释。 - 示例:展示SQL输出。 - 相关问题。 引用来源:在解释时,引用[2]和[5]提供了SQL,所以可以添加引用标识。</think>### PostgreSQL 查询占用空间大小并按大小排序 在 PostgreSQL 中,查询占用空间大小并按大小排序是数据库优化和存储管理的关键操作。这有助于识别空间消耗较大的,优化性能或规划存储扩展。以下是详细的方法和 SQL 实现,基于 PostgreSQL 内置函数(如 `pg_total_relation_size` 和 `pg_size_pretty`),确保查询高效且结果易读。 #### 步骤说明 1. **核心函数**: - `pg_total_relation_size(relation_name)`:计算的总占用空间(包括数据、索引和 TOAST 数据),单位为字节。 - `pg_size_pretty(size)`:将字节转换为易读格式(如 MB、GB)。 - `information_schema.tables`:系统视图,提供所有的基础信息。 2. **过滤系统**:通过 `WHERE table_schema NOT IN ('pg_catalog', 'information_schema')` 排除系统,只关注用户。 3. **排序**:按空间大小降序排序(`ORDER BY ... DESC`),优先显示占用空间最大的。 #### 推荐 SQL 查询 以下 SQL 查询所有用户占用空间大小,并按降序排列。**注意**:替换 `'public'` 为你的 schema 名称,或移除 `WHERE` 条件查询所有 schema。 ```sql SELECT table_schema || '.' || table_name AS 名, pg_size_pretty(pg_total_relation_size(table_schema || '.' || table_name)) AS 总占用空间 FROM information_schema.tables WHERE table_schema NOT IN ('pg_catalog', 'information_schema') -- 排除系统 AND table_schema = 'public' -- 可选:指定 schema,例如 'public' ORDER BY pg_total_relation_size(table_schema || '.' || table_name) DESC; ``` #### 查询输出示例 执行后,结果类似: | 名 | 总占用空间 | |---------------|------------| | public.orders | 350 MB | | public.users | 120 MB | | public.logs | 45 MB | #### 关键点解释 - **总占用空间**:包括数据、索引和 TOAST(大型对象存储)。例如,`pg_total_relation_size` 比 `pg_table_size`(仅数据)更全面[^2][^5]。 - **性能优化**:此查询在大型数据库中可能较慢,建议在低峰期运行。如需更详细分析(如分离数据和索引大小),可扩展 SQL(见下文)。 - **空间释放**:PostgreSQL 自动管理空间回收,删除数据后空间可能不会立即释放,需定期执行 `VACUUM FULL` 或 `REINDEX`[^4]。 #### 扩展查询(可选) 如果需要分别看数据大小、索引大小和总大小,使用此 SQL: ```sql SELECT table_schema || '.' || table_name AS 名, pg_size_pretty(pg_table_size(table_schema || '.' || table_name)) AS 数据大小, pg_size_pretty(pg_indexes_size(table_schema || '.' || table_name)) AS 索引大小, pg_size_pretty(pg_total_relation_size(table_schema || '.' || table_name)) AS 总占用空间 FROM information_schema.tables WHERE table_schema = 'public' -- 指定 schema ORDER BY pg_total_relation_size(table_schema || '.' || table_name) DESC; ``` 此版本清晰展示空间分布,帮助识别索引膨胀等问题[^3][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值