PostgreSQL数据库按大小组成

时间:2014-04-08 14:35:49

标签: sql postgresql size

我试图理解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

显而易见的问题是,表和索引加起来比数据库本身更多。所以,我的查询都是错误的,或者我不理解大小的表示方式。

有人可以告诉我我的疑问有什么问题吗? 另外,我还有其他主要组件吗?

1 个答案:

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

使用pg_stat_all_tables

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