PostgreSQL 教程: 获取表、数据库、索引、表空间和值的大小

九月 15, 2023

摘要:在本教程中,您将学习如何使用一些方便的函数获取数据库、表、索引、表空间的大小。

PostgreSQL 表大小

要获取特定表的大小,可以使用pg_relation_size()函数。例如,您可以获取dvdrental示例数据库actor表的大小,如下所示:

select pg_relation_size('actor');

pg_relation_size()函数返回特定表以字节为单位的大小:

pg_relation_size
------------------
            16384

为了使结果更具可读性,您可以使用pg_size_pretty()函数。pg_size_pretty()函数获取另一个函数的结果,并根据需要使用字节、kB、MB、GB 或 TB 对其进行格式化。例如:

SELECT
    pg_size_pretty (pg_relation_size('actor'));

以下是以 kB 为单位的输出:

 pg_size_pretty
    ----------------
     16 kB
    (1 row)

pg_relation_size()函数仅返回表自身的大小,不包括索引或附加对象。

要获取表的总大小,可以使用pg_total_relation_size()函数。例如,要获取 actor 表的总大小,可以使用以下语句:

SELECT
    pg_size_pretty (
        pg_total_relation_size ('actor')
    );

下面显示了输出:

 pg_size_pretty
----------------
 72 kB
(1 row)

您可以使用pg_total_relation_size()函数查找包括索引在内的最大表的大小。

例如,以下查询返回dvdrental数据库中前 5 个最大的表:

SELECT
    relname AS "relation",
    pg_size_pretty (
        pg_total_relation_size (C .oid)
    ) AS "total_size"
FROM
    pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C .relnamespace)
WHERE
    nspname NOT IN (
        'pg_catalog',
        'information_schema'
    )
AND C .relkind <> 'i'
AND nspname !~ '^pg_toast'
ORDER BY
    pg_total_relation_size (C .oid) DESC
LIMIT 5;

这是输出:

  relation  | total_size
------------+------------
 rental     | 2472 kB
 payment    | 2232 kB
 film       | 688 kB
 film_actor | 536 kB
 inventory  | 464 kB
(5 rows)

PostgreSQL 数据库大小

要获取整个数据库的大小,可以使用pg_database_size()函数。例如,以下语句返回dvdrental数据库的大小:

SELECT
    pg_size_pretty (
        pg_database_size ('dvdrental')
    );

该语句返回以下结果:

pg_size_pretty
----------------
 15 MB
(1 row)

要获取当前数据库服务器中每个数据库的大小,可以使用以下语句:

SELECT
    pg_database.datname,
    pg_size_pretty(pg_database_size(pg_database.datname)) AS size
    FROM pg_database;
    datname     |  size
----------------+---------
 postgres       | 7055 kB
 template1      | 7055 kB
 template0      | 6945 kB
 dvdrental      | 15 MB

PostgreSQL 索引大小

要获取附加到表的所有索引的总大小,可以使用pg_indexes_size()函数。

pg_indexes_size()函数接受 OID 或表名作为参数,并返回该表附加的所有索引使用的总磁盘空间。

例如,要获取附加到film表的所有索引的总大小,请使用以下语句:

SELECT
    pg_size_pretty (pg_indexes_size('actor'));

这是输出:

 pg_size_pretty
----------------
 32 kB
(1 row)

PostgreSQL 表空间大小

要获取表空间的大小,可以使用pg_tablespace_size()函数。pg_tablespace_size()函数接受表空间名称,并返回以字节为单位的大小。

以下语句返回pg_default表空间的大小:

SELECT
    pg_size_pretty (
        pg_tablespace_size ('pg_default')
    );

该语句返回以下输出:

 pg_size_pretty
----------------
 43 MB
(1 row)

PostgreSQL 值大小

要查找需要多少空间来存储特定值,可以使用pg_column_size()函数,例如:

select pg_column_size(5::smallint);
 pg_column_size
----------------
              2
(1 row)

select pg_column_size(5::int);
 pg_column_size
----------------
              4
(1 row)

select pg_column_size(5::bigint);
 pg_column_size
----------------
              8
(1 row)

在本教程中,您学习了各种方便的函数来获取数据库、表、索引、表空间和值的大小。