函数表
函数名 | 返回类型 | 描述 |
---|---|---|
pg_size_pretty(bigint|numeric) |
text | 转换为易读单位 |
pg_database_size(oid|name) |
bigint | 根据OID或名称, 查询数据库所占的磁盘空间 |
pg_table_size(regclass) |
bigint | 根据表OID或表名查询表所占的磁盘空间,不包含索引(但是包含TOAST,自由空间映射和可视映射) |
pg_indexes_size(regclass) |
bigint | 根据表OID或表名, 查询所有索引所占磁盘空间 |
pg_relation_size(relation regclass, fork text) |
bigint | 根据OID或名的表或索引,以及fork指定分叉树('main', 'fsm' 或'vm')查询所占的磁盘空间 |
pg_relation_size(relation regclass) |
bigint |
pg_relation_size(..., 'main') 的缩写 |
pg_total_relation_size(regclass) |
bigint | 根据表OID或表名, 查询所占的总磁盘空间,包括所有索引和TOAST数据 |
pg_tablespace_size(oid|name) |
bigint | 根据OID或名称, 查询表空间所占的磁盘空间 |
pg_column_size(any) |
int | 存储某个数据需要的字节数(可能压缩过) |
pg_partition_size(oid|text, oid|text) |
bigint | 查询表分区所占的磁盘空间。其中,第一个参数为表名|oid,第二个参数为分区名|oid。 |
pg_partition_indexes_size(oid|text, oidtext) |
bigint | 指定名称的分区的索引使用的磁盘空间。其中,第一个参数为表名|oid,第二个参数为分区名|oid。 |
常见例子
- 查询所有数据库大小
select pg_database.datname, pg_size_pretty(pg_database_size(datname)) as size from pg_database;
- 查询所有表大小
select relname, pg_size_pretty(pg_relation_size(relid)) as size from pg_stat_user_tables where schemaname='public';
- 查询表总数
SELECT count(*) from pg_stat_user_tables where schemaname='public';
- 查询所有索引大小
select indexrelname, pg_size_pretty(pg_relation_size(relid)) as size from pg_stat_user_indexes where schemaname='public';
名词解释
FSM,指的是Free Space Map,空闲空间映射表。一个relation有多个8KB大小的block,这些block存储在磁盘上。一个relation最大只能有4G个block,每个block大小为8KB,也就是说一个relation的磁盘大小最大为32TB。
relation的不断的插入删除记录,会造成很多的block其实是有空闲空间的,Page的空闲空间管理的只是8KB空间内有多少剩余空间,而FSM管理的则是relation对应的所有的Block(或者说page,whatever,反正都是这8KB的空间)分别有多少剩余空间。
在数据库系统内部,这些文件(main、FSM、VM等)也被成为相应关系的分支(fork);空闲空间映射是表/索引数据文件的第一个分支(分支编号为1),可见性映射文件是数据文件的第二个分支(分支编号为2),数据文件的分支编号为0。
每个关系可能有4种分支,分支编号分别为0、1、2、3, 0号分支main为关系数据文件的文件主体。1号分支fsm保存了main分支中空闲空间的信息,2号分支vm保存了main分支中可见性的信息,3号分支init是很少见的特殊分支,通常表示不被日志记录的表与索引。
TOAST是The Oversized-Attribute Storage Technique的缩写,直译比较难理解,我们这里叫行外存储技术。因为在PostgreSQL中,一条记录不能跨PAGE存储,毕竟默认一个PAGE只有8K,不能存储很大的值,所以存储大字段的值,就使用TOAST存储。它和原表的数据是分开存储的。TOAST存储的表并不能单独创建,只有当普通表包含了main,extended或external存储格式的字段时,系统会自动创建一个和普通表关联的TOAST表。当一行记录(tuple)存储的(包括压缩后的大小)大小超过TOAST_TUPLE_THRESHOLD(默认2K)时,会存储到TOAST表。
网友评论