美文网首页
pg(PostgreSQL) 查询数据库, 表, 索引, 表空间

pg(PostgreSQL) 查询数据库, 表, 索引, 表空间

作者: 饱饱想要灵感 | 来源:发表于2022-06-23 14:26 被阅读0次

    函数表

    函数名 返回类型 描述
    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。

    常见例子

    1. 查询所有数据库大小
    select pg_database.datname, pg_size_pretty(pg_database_size(datname)) as size from pg_database;
    
    1. 查询所有表大小
    select relname, pg_size_pretty(pg_relation_size(relid)) as size from pg_stat_user_tables where schemaname='public';
    
    1. 查询表总数
    SELECT count(*) from pg_stat_user_tables where schemaname='public';
    
    1. 查询所有索引大小
    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表。

    相关文章

      网友评论

          本文标题:pg(PostgreSQL) 查询数据库, 表, 索引, 表空间

          本文链接:https://www.haomeiwen.com/subject/spmmvrtx.html