目前,我的开发数据库占用的磁盘空间比应有的多。该项目使用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....
查询正确获取所有表名吗?
答案 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;