公司有个导数据的工具,是把数据库里面的一条条记录生成SQL文件, 然后导入到别的数据库里面,在导入SQL文件的时候非常慢, 以前没有这个问题。 后来网上查了下,也做了实验都没有效果。 后来看了下postgresql SQL的手册看了下系统的表,发现有个表可以查看表所占用的空间,和视图之类的.
观察磁盘使用情况
Table of Contents
25.1. 判断磁盘的使用量
25.2. 磁盘满导致的失效
本章讨论如何观察PostgreSQL数据库系统的磁盘使用情况。
25.1. 判断磁盘的使用量
每个表都有一个主堆的磁盘文件,大多数数据都存储在这里。如果一个表有着可能会很长的字段, 则另外还有一个TOAST文件与这个表相关联, 用于存储因为数值太长而不能存储在主表里面的数据(参阅 Section 50.2)。 如果有这个扩展表,那么表上会有一个TOAST索引。 当然,同时还可能有索引和基表关联。 每个表和索引都存放在单独的磁盘文件里 — 如果文件超过一吉,甚至可能多于一个文件。 这些文件的命名原则在 Section 50.1 里描述。
你可以从三个地方监视磁盘空间:从 psql 里使用 VACUUM 的信息,从 psql 里使用 contrib/dbsize 里面的工具,以及在命令行上使用 contrib/oid2name 里面的工具。如果 psql 和任何最近刚刚清理(或者分析过)的数据库进行联接, 那么我们可以用查询来查看任意表的磁盘使用:
SELECT relfilenode, relpages FROM pg_class WHERE relname = 'customer';
relfilenode | relpages
-------------+----------
16806 | 60
(1 row)
每个页通常都是 8 K字节。(记住,relpages只是由 VACUUM, ANALYZE 和几个 DDL 命令,比如CREATE INDEX 所更新。) 如果你想直接检查表的磁盘文件,那么 relfilenode 应该有用。
要显示 TOAST 的表使用的空间,我们可以使用一个类似下面这样的查询:
SELECT relname, relpages
FROM pg_class,
(SELECT reltoastrelid FROM pg_class
WHERE relname = 'customer') ss
WHERE oid = ss.reltoastrelid
OR oid = (SELECT reltoastidxid FROM pg_class
WHERE oid = ss.reltoastrelid)
ORDER BY relname;
relname | relpages
----------------------+----------
pg_toast_16806 | 0
pg_toast_16806_index | 1
你也可以很容易地显示索引的用量:
SELECT c2.relname, c2.relpages
FROM pg_class c, pg_class c2, pg_index i
WHERE c.relname = 'customer'
AND c.oid = i.indrelid
AND c2.oid = i.indexrelid
ORDER BY c2.relname;
relname | relpages
----------------------+----------
customer_id_indexdex | 26
我们很容易用下面的信息找出最大的表和索引:
SELECT relname, relpages FROM pg_class ORDER BY relpages DESC;
relname | relpages
----------------------+----------
bigtable | 3290
customer | 3144
contrib/dbsize 向我们的数据库里装载一些函数,这些函数 允许我们在 psql 里找出一个表或者一个数据库的大小,而且不用 VACUUM或者 ANALYZE。
你也可以使用 oid2name 显示磁盘用量。参阅 该目录中的 README.oid2name 获取例子。它包括一个为每个 数据库显示磁盘用量的脚本。
根据上面查找出rightgrouptable占用了很大的空间, 有5G多, 导致写入数据很慢, 系统有张表示目录树,而且做了权限的,每个用户都有节点的权限,这种设置导致了grouptable数据量非常大,而且现有的系统不再使用该表,这里需要清理一下表数据, 使用命令:
truncate table rightgrouptable
这个相当于删除rightgrouptable里面的所有数据, truncate比delete 快不少。
select relname, relpages from pg_class order by relpages desc limit 100 再查询下,表空间占用就少了不少,然后再导入数据就不再慢。