PostgreSQL中表大小、索引大小

    xiaoxiao2023-10-31  159

    一、PostgreSQL中表大小、索引大小

    需要了解每张表的具体大小,PostgreSQL提供了很多工具


    1.1 来查看任意表的磁盘用量

    每个表都有一个主要的堆磁盘文件,大多数数据都存储在其中。如果一个表有着可能会很宽(尺寸大)的列, 则另外还有一个TOAST文件与这个表相关联, 它用于存储因为太宽而不能存储在主表里面的值(http://www.postgres.cn/docs/9.6/storage-toast.html)。如果有这个附属文件,那么TOAST表上会有一个可用的索引。 当然,同时还可能有索引和基表关联。每个表和索引都存放在单独的磁盘文件里 — 如果文件超过 1G 字节,甚至可能多于一个文件。这些文件的命名原则的描:述http://www.postgres.cn/docs/9.6/storage-file-layout.html。

    SELECT pg_relation_filepath(oid), relpages FROM pg_class WHERE relname = 'customers';

    pg_relation_filepath 在服务器上的相对位置。PGDATA的一个常见位置是 /var/lib/pgsql/data。由不同数据库实例所管理的多个集簇可以在同一台机器上共存relpages 的为页的数量,每页大小为8k。(reltuples是行数)


    每个页通常都是 8K 字节(记住,relpages只会由VACUUM、ANALYZE和少数几个 DDL 命令如CREATE INDEX所更新)。如果你想直接检查表的磁盘文件,那么文件路径名应该有用。

    要显示TOAST表使用的空间,我们可以使用一个类似下面这样的查询:

    SELECT relname, relpages FROM pg_class, (SELECT reltoastrelid FROM pg_class WHERE relname = 'customers') AS ss WHERE oid = ss.reltoastrelid OR oid = (SELECT indexrelid FROM pg_index WHERE indrelid = ss.reltoastrelid) ORDER BY relname;

    只有当宽度不能用最小单元表示时才会有TOAST

    可以统计表的大小 :

    SELECT relname,relpages,reltuples FROM pg_class ORDER BY relpages DESC;

    更多关于pg_class的参数:http://www.postgres.cn/docs/9.6/catalog-pg-class.html


    1.2 索引

    索引查看,使用下面sql

    SELECT c2.relname, c2.relpages FROM pg_class c, pg_class c2, pg_index i WHERE c.relname = 'customers' AND c.oid = i.indrelid AND c2.oid = i.indexrelid ORDER BY c2.relname;


    按索引大小进行排序。

    SELECT c2.relname, c2.relpages FROM pg_class c, pg_class c2, pg_index i WHERE c.oid = i.indrelid AND c2.oid = i.indexrelid ORDER BY c2.relpages DESC;

    参考

    http://www.postgres.cn/docs/9.6/disk-usage.html
    最新回复(0)