我刚刚创建了一个新数据库,它已经占用了7MB。你知道占用这么多空间吗?有没有办法获得数据库的“实际”大小,因为存储了多少数据?
0f41ba72-a1ea-4516-a9f0-de8a3609bc4a=> select pg_size_pretty(pg_database_size(current_database()));
pg_size_pretty
----------------
7055 kB
(1 row)
0f41ba72-a1ea-4516-a9f0-de8a3609bc4a=> \dt
No relations found.
答案 0 :(得分:3)
好吧,即使您没有创建任何关系,但新数据库不为空。发布CREATE DATABASE
时,Postgres会将TEMPLATE
数据库(包含目录表)复制到新数据库。事实上,“什么都没有创造,一切都被改变了”。您可以使用以下命令检查:
--Size per table
SELECT pg_size_pretty(pg_total_relation_size(oid)), relname FROM pg_class WHERE relkind = 'r' AND NOT relisshared;
--Total size
SELECT pg_size_pretty(sum(pg_total_relation_size(oid))) FROM pg_class WHERE relkind = 'r' AND NOT relisshared;
--Total size of databases
SELECT pg_size_pretty(pg_database_size(oid)), datname FROM pg_database;
来自docs:
的引用默认情况下,将通过克隆标准来创建新数据库 系统数据库template1。
答案 1 :(得分:2)
空数据库包含system catalogs和The Information Schema。
执行此查询以查看它们:
select nspname as schema, relname as table, pg_total_relation_size(c.oid)
from pg_class c
join pg_namespace n on n.oid = relnamespace
order by 3 desc;
schema | table | pg_total_relation_size
--------------------+-----------------------------+------------------------
pg_catalog | pg_depend | 1146880
pg_catalog | pg_proc | 950272
pg_catalog | pg_rewrite | 589824
pg_catalog | pg_attribute | 581632
... etc
您可以使用查询获取非系统关系的总大小:
select sum(pg_total_relation_size(c.oid))
from pg_class c
join pg_namespace n on n.oid = relnamespace
where nspname not in ('information_schema', 'pg_catalog', 'pg_toast');
查询在 empty 数据库上返回null
。
答案 2 :(得分:0)
每个PostgreSQL数据库都有自己的系统目录.. 7MB。所以你的数字是正确的。 PostgreSQL专为客户端 - 服务器架构和1GB及更长的数据库而设计 - 因此成本并不高。
如果您需要减少空间分配,可以尝试嵌入式数据库,如SQLite或Firebird。