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: 75 · Posted: 2025-01-20
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb/LiteNote扫描下方二维码关注公众号和小程序↓↓↓
Loading...