PostgreSQL 查看表的大小
PostgreSQL About 3,480 words表的组成
表(Table),包含了本体表与TOAST表两个部分:
- 本体表:存储关系本身的数据,即狭义的关系,
relkind='r'(relkind是pg_class中的字段)。 TOAST表:与本体表一一对应,存储过大的字段,relinkd='t'(relkind是pg_class中的字段)。
每个表(本体表和TOAST表),又由主体与索引两个关系(Relation)组成(对本体表而言,可以没有索引关系),TOAST表也有自己的索引,但有且仅有一个。
- 主体关系:存储元组。
- 索引关系:存储索引元组。
每个关系又可能会有四种分支:
main:关系的主文件,编号为0。fsm:保存关于main分支中空闲空间的信息,编号为1。vm:保存关于main分支中可见性的信息,编号为2。init:用于不被日志记录(unlogged)的表和索引,很少见的特殊分支,编号为3。
每个分支存储为磁盘上的一到多个文件:超过1GB的文件会被划分为最大1GB的多个段。
综上所述,一个表由几个关系组成:
- 本体表的主体关系(单个)
- 本体表的索引(多个)
TOAST表的主体关系(单个)TOAST表的索引(单个)
而每个关系实际上可能又包含了1~3个分支:main(必定存在),fsm,vm。
表的大小统计函数
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)
参考
Views: 999 · Posted: 2025-01-20
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb/LiteNote扫描下方二维码关注公众号和小程序↓↓↓
Loading...