PostgreSQL 查看表的大小

PostgreSQL About 3,480 words

表的组成

表(Table),包含了本体表TOAST表两个部分:

  • 本体表:存储关系本身的数据,即狭义的关系,relkind='r'relkindpg_class中的字段)。
  • TOAST表:与本体表一一对应,存储过大的字段,relinkd='t'relkindpg_class中的字段)。

每个表(本体表和TOAST表),又由主体索引两个关系Relation)组成(对本体表而言,可以没有索引关系),TOAST表也有自己的索引,但有且仅有一个。

  • 主体关系:存储元组。
  • 索引关系:存储索引元组。

每个关系又可能会有四种分支

  • main:关系的主文件,编号为0
  • fsm:保存关于main分支中空闲空间的信息,编号为1
  • vm:保存关于main分支中可见性的信息,编号为2
  • init:用于不被日志记录(unlogged)的表和索引,很少见的特殊分支,编号为3

每个分支存储为磁盘上的一到多个文件:超过1GB的文件会被划分为最大1GB的多个段。

综上所述,一个表由几个关系组成:

  • 本体表的主体关系(单个)
  • 本体表的索引(多个)
  • TOAST表的主体关系(单个)
  • TOAST表的索引(单个)

而每个关系实际上可能又包含了1~3个分支:main(必定存在),fsmvm

表的大小统计函数

PostgreSQL中提供了一系列函数用于确定各个部分占用的空间大小。

函数 统计维度
pg_total_relation_size(oid) 整个关系,包括表,索引,TOAST
pg_table_size(oid) 关系中除索引外部分所占空间(包含本体表、TOAST表、TOAST表索引)
pg_indexes_size(oid) 关系索引部分所占空间
pg_relation_size(oid) 获取一个关系主文件部分的大小(main分支)
pg_relation_size(oid, 'main') 获取关系main分支大小
pg_relation_size(oid, 'fsm') 获取关系fsm分支大小
pg_relation_size(oid, 'vm') 获取关系vm分支大小
pg_relation_size(oid, 'init') 获取关系init分支大小

示例

创建示例表

CREATE TABLE example (
    id SERIAL PRIMARY KEY,
    large_text TEXT
);

查看空表大小

postgres=# select pg_size_pretty(pg_total_relation_size('example'));
 pg_size_pretty
----------------
 16 kB
(1 row)

postgres=# select pg_size_pretty(pg_table_size('example'));
 pg_size_pretty
----------------
 8192 bytes
(1 row)

postgres=# select pg_size_pretty(pg_indexes_size('example'));
 pg_size_pretty
----------------
 8192 bytes
(1 row)

再写入一条大文本

INSERT INTO example (large_text) VALUES (repeat('A', 1000000));

pg_total_relation_size

pg_total_relation_size = pg_table_size + pg_indexes_size

postgres=# select pg_size_pretty(pg_total_relation_size('example'));
 pg_size_pretty
----------------
 80 kB
(1 row)

pg_table_size

统计example表的大小,pg_table_size统计的包含本体表、TOAST表、TOAST表索引

postgres=# select pg_size_pretty(pg_table_size('example'));
 pg_size_pretty
----------------
 64 kB
(1 row)

pg_indexes_size

统计example表的索引大小

postgres=# select pg_size_pretty(pg_indexes_size('example'));
 pg_size_pretty
----------------
 16 kB
(1 row)

统计example表对应的TOAST表的索引的大小

postgres=# select pg_size_pretty(pg_indexes_size('pg_toast.pg_toast_90069'));
 pg_size_pretty
----------------
 16 kB
(1 row)

pg_relation_size

统计example表的main分支大小

postgres=# select pg_size_pretty(pg_relation_size('example'));
 pg_size_pretty
----------------
 8192 bytes
(1 row)

备注

查看本体表对应的TOAST

postgres=# select * from pg_class where relname = 'pg_toast_' || (select oid from pg_class where relname = 'example');
-[ RECORD 1 ]-------+---------------
oid                 | 90073
relname             | pg_toast_90069
relnamespace        | 99
reltype             | 0
reloftype           | 0
relowner            | 10
relam               | 2
relfilenode         | 90073
reltablespace       | 0
relpages            | 0
reltuples           | -1
relallvisible       | 0
reltoastrelid       | 0
relhasindex         | t
relisshared         | f
relpersistence      | p
relkind             | t
relnatts            | 3
relchecks           | 0
relhasrules         | f
relhastriggers      | f
relhassubclass      | f
relrowsecurity      | f
relforcerowsecurity | f
relispopulated      | t
relreplident        | n
relispartition      | f
relrewrite          | 0
relfrozenxid        | 10268
relminmxid          | 1
relacl              |
reloptions          |
relpartbound        |

pg_database_size查看整个数据库大小

postgres=# select pg_size_pretty(pg_database_size('postgres'));
 pg_size_pretty
----------------
 12 MB
(1 row)

参考

https://pigsty.cc/zh/blog/admin/mon-table-size/

Views: 75 · Posted: 2025-01-20

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb/LiteNote

扫描下方二维码关注公众号和小程序↓↓↓

扫描下方二维码关注公众号和小程序↓↓↓


Today On History
Browsing Refresh