我试图理解1)哪些组件构成postgres数据库,2)如何确定每种类型的总大小,即40 MB表,30 MB指数等。
我正在运行9.2版。
我最了解它,以下查询应该给我数据库,所有表和所有索引的总大小。
数据库:select pg_size_pretty(pg_database_size('postgres'))
输出:5272 kB
表:select pg_size_pretty(SUM(pg_table_size(relid))) FROM pg_stat_all_tables
输出:3720 kB
指数:select pg_size_pretty(SUM(pg_indexes_size(relid))) FROM pg_stat_all_tables
输出:2712 kB
显而易见的问题是,表和索引加起来比数据库本身更多。所以,我的查询都是错误的,或者我不理解大小的表示方式。
有人可以告诉我我的疑问有什么问题吗? 另外,我还有其他主要组件吗?
答案 0 :(得分:1)
错误源于两次计算TOAST表。 Per documentation:
pg_table_size(regclass)
...指定表使用的磁盘空间, 排除索引(但包括TOAST ,可用空间地图和可见性地图)
大胆强调我的。但pg_stat_all_tables
也会列出 TOAST表。因此,您将该空间计算两次
另外,您必须从 information_schema 中排除对象,这些对象是视图。你会再次重复计算。
尝试这些查询,他们为我加起来。 Postgres中的测试 9.3 :
SELECT pg_size_pretty(pg_database_size('postgres')) -- 6306 kB
SELECT count(*), pg_size_pretty(SUM(pg_table_size(relid)))
FROM pg_stat_all_tables
WHERE schemaname NOT IN ('information_schema', 'pg_toast'); -- 3848 kB
SELECT count(*), pg_size_pretty(SUM(pg_indexes_size(relid)))
FROM pg_stat_all_tables
WHERE schemaname NOT IN ('information_schema', 'pg_toast'); -- 2456 kB
与pg_class
的数据比较(这是基表,应该是参考):
SELECT count(*), pg_size_pretty(SUM(pg_total_relation_size(c.oid)))
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE relkind = 'r'
AND n.nspname <> 'information_schema' -- 6304 kB