我从Oracle来到Postgres,寻找一种方法来查找表和索引大小的字节/MB/GB/等,甚至更好的所有表的大小。在Oracle中,我有一个讨厌的长查询,查看user_lobs和user_segments以返回一个答案。

我假设在Postgres中有一些东西我可以在information_schema表中使用,但我不知道在哪里。


当前回答

试试数据库对象大小函数。一个例子:

SELECT pg_size_pretty(pg_total_relation_size('"<schema>"."<table>"'));

对于所有表,如下所示:

SELECT
    table_schema || '.' || table_name AS table_full_name,
    pg_size_pretty(pg_total_relation_size('"' || table_schema || '"."' || table_name || '"')) AS size
FROM information_schema.tables
ORDER BY
    pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') DESC;

编辑:为了方便起见,下面是@phord提交的查询:

SELECT
    table_name,
    pg_size_pretty(table_size) AS table_size,
    pg_size_pretty(indexes_size) AS indexes_size,
    pg_size_pretty(total_size) AS total_size
FROM (
    SELECT
        table_name,
        pg_table_size(table_name) AS table_size,
        pg_indexes_size(table_name) AS indexes_size,
        pg_total_relation_size(table_name) AS total_size
    FROM (
        SELECT ('"' || table_schema || '"."' || table_name || '"') AS table_name
        FROM information_schema.tables
    ) AS all_tables
    ORDER BY total_size DESC
) AS pretty_sizes;

我稍微修改了一下,使用pg_table_size()来包含元数据并使大小相加。

其他回答

试试数据库对象大小函数。一个例子:

SELECT pg_size_pretty(pg_total_relation_size('"<schema>"."<table>"'));

对于所有表,如下所示:

SELECT
    table_schema || '.' || table_name AS table_full_name,
    pg_size_pretty(pg_total_relation_size('"' || table_schema || '"."' || table_name || '"')) AS size
FROM information_schema.tables
ORDER BY
    pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') DESC;

编辑:为了方便起见,下面是@phord提交的查询:

SELECT
    table_name,
    pg_size_pretty(table_size) AS table_size,
    pg_size_pretty(indexes_size) AS indexes_size,
    pg_size_pretty(total_size) AS total_size
FROM (
    SELECT
        table_name,
        pg_table_size(table_name) AS table_size,
        pg_indexes_size(table_name) AS indexes_size,
        pg_total_relation_size(table_name) AS total_size
    FROM (
        SELECT ('"' || table_schema || '"."' || table_name || '"') AS table_name
        FROM information_schema.tables
    ) AS all_tables
    ORDER BY total_size DESC
) AS pretty_sizes;

我稍微修改了一下,使用pg_table_size()来包含元数据并使大小相加。

PostgreSQL表有三个组件:表本身、表上的索引以及潜在的TOAST数据。在http://wiki.postgresql.org/wiki/Disk_Usage上有几个例子展示了如何以各种方式滑动和切割可用信息

下面的查询将为您提供服务

SELECT nspname || '.' || 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 20;

链接:https://wiki.postgresql.org/wiki/Disk_Usage

如果数据库名称为snort,则用下面的语句指定大小:

psql -c "\l+ snort" | awk -F "|" '{print $7}'

试试这个脚本来查找所有表的大小:

SELECT
    table_schema || '.' || table_name AS TableName,
    pg_size_pretty(pg_total_relation_size('"' || table_schema || '"."' || table_name || '"')) AS TableSize
FROM information_schema.tables
ORDER BY
    pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') DESC

对于PostgreSQL中其他不同的脚本,请访问这个url: http://www.dbrnd.com/2015/05/how-to-find-size-of-database-and-table-in-postgresql/