为什么我的空postgres数据库是7MB?

时间:2017-06-24 16:04:12

标签: postgresql

我刚刚创建了一个新数据库,它已经占用了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.

3 个答案:

答案 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 catalogsThe 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。