PostgreSQL pg_database_size与pg_total_relation_size

时间:2015-09-13 19:49:01

标签: django postgresql psycopg2

目前,我的开发数据库占用的磁盘空间比应有的多。该项目使用Django,Docker-Machine和PostgreSQL。奇怪的是,当我使用pg_database_size()时,它表示使用了大约9MB的磁盘空间(上传的文件只有20KB)。但是,当我总结所有表的大小(即总结查询pg_total_relation_size()返回的每个表名上执行SELECT relname FROM pg_class WHERE relkind='r' AND relname !~ '^(pg_|sql_)';的结果)时,报告的总大小仅为1.8MB。我使用psycopg2来查询我的数据库。

为什么大小确实存在这样的差异?我看到了一个类似的问题,答案似乎是清除任何未被正确删除的LOB。我做了以下事情:

docker exec -it <name_of_database_container> vacuumlo -U postgres -W -v postgres

并且它报告说它成功删除了0个LOB,所以看起来LOB从来不是我的问题。还有什么可以继续?我没有使用SELECT relname....查询正确获取所有表名吗?

2 个答案:

答案 0 :(得分:1)

您的pg_total_relation_size查询排除以Int开头的系统表。那些的表仍占用空间。

我手中的最小可能(非破坏)数据库大约为7.2MB。所以你提供的数字可以解决。

答案 1 :(得分:0)

pg_total_relation_size的文档说它包含了索引的大小,但我的数据库并不是这样。这可能是因为我使用显式名称而不是匿名索引创建了索引。

以下是一些有助于追踪空间位置的查询:

-- total database size on disk
select * from pg_size_pretty(pg_database_size('etlq'));

-- total sizes by schema
select nspname, pg_size_pretty(sum(pg_total_relation_size(C.oid)))
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
GROUP BY nspname;

-- total size by relation
select nspname, relname, pg_size_pretty(pg_total_relation_size(C.oid)), pg_total_relation_size(c.oid)
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE true
and pg_total_relation_size(C.oid) > 10 * 1024 * 1024 -- greater than 10MB
ORDER BY pg_total_relation_size(C.oid) DESC, nspname;