pgsql查看数据库,表,索引,表空间以及大小

4,969 阅读2分钟

这是我参与更文挑战的第1天,活动详情查看: 更文挑战

背景

最近项目上因为做了数据迁移,大量的数据反反复的进行表处理。(因为此次做数据迁移用的办法相对比较简单,调用接口查询并插入到新表)而自己每次清理表都是直接使用了delete语句。刚开始没有察觉到查询效率,后来慢慢得列表查询的时候加载数据越来越慢,才开始进行分析。

分析

按照常规的思考,查看索引,explain查询语句等,如果自己在日志上单独在navicat的时候查询速度也挺快的。因为这个是主表,字段较多,而且项目上线在即,并不适合做分库分表。这时候自己有点手足无措了。只能采用最粗暴的复制表及数据先不影响测试的流程。后来想了一下应该是delete时候并没有释放表空间导致的。

遗留问题

其实在处理完这个之后还发现了表数据空间占了80G多,就一张单表,但表数据容量也只有八万条数据。想想也是蛮恐怖的。实在是pgsql有点不一致,了解不够深不够透彻。目前初步定位不知道是不是定时任务的事务导致占用的表空间。因为自己业务并不涉及到大量的表,不再做阐述。

记录

查看数据库

1、查看数据库大小: select pg_database_size('XXX');

2、以KB,MB,GB的方式来查看数据库大小: select pg_database_size('XXX');

3、查看所有数据库的大小: select pg_database.datname, pg_database_size(pg_database.datname) AS size from pg_database;

查看数据表

1、查看表大小: select pg_relation_size('XXX');

2、查看表的总大小,包括索引大小: select pg_size_pretty(pg_total_relation_size('XXX'));

查看索引

1、查看索引大小: select pg_size_pretty(pg_relation_size('XXX')); XXX为索引名

查看表空间

1、查看表空间大小: select pg_size_pretty(pg_tablespace_size('XXX'));

以上只是自己整理记录的常用的查询字段,切记不要用delete了,并不会释放表空间。

解决方案

需要dba适时对表空间进行清理;TRUNCATE table_name来进行清理表;

最后

本博文只是自己的经验汇总,还有不足,会以后改进。