如何找到Postgres/PostgreSQL表及其索引的磁盘大小

mmr*_*ins 145 postgresql

我将从Oracle发布Postgres并寻找一种方法来查找表和索引大小,以字节/ MB/GB /等为单位,甚至更好地查找所有表的大小.在Oracle中,我有一个讨厌的长查询,查看user_lobs和user_segments以回复答案.我假设在Postgres中我可以在information_schema表中使用,但我没有看到.提前致谢.

aib*_*aib 256

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

SELECT pg_size_pretty(pg_total_relation_size('"<schema>"."<table>"'));
Run Code Online (Sandbox Code Playgroud)

对于所有表格,有以下几点:

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;
Run Code Online (Sandbox Code Playgroud)

编辑:这是@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;
Run Code Online (Sandbox Code Playgroud)

我稍微修改了它以用于pg_table_size()包含元数据并使大小相加.

  • 顺便说一句,如果某人有任何关于如何对这个重复的表达进行别名的信息,我会很高兴听到它. (3认同)
  • 你不能对它进行别名,但你总是可以在子查询中运行它...如:SELECT table_full_name,pg_size_pretty(size)FROM(SELECT .. AS table_full_name,.. AS size FROM ....)x ORDER BY size (2认同)
  • 一个建议:将 `'"' || table_schema || '"."' || table_name || '"'` 改为 `format('%I.%I', table_schema, table_name)`。 (2认同)

Hen*_*wan 168

显示数据库大小:

\l+

例如

=> \l+
 berbatik_prd_commerce    | berbatik_prd     | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 19 MB   | pg_default | 
 berbatik_stg_commerce    | berbatik_stg     | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 8633 kB | pg_default | 
 bursasajadah_prd         | bursasajadah_prd | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 1122 MB | pg_default | 
Run Code Online (Sandbox Code Playgroud)

显示表格大小:

\d+

例如

=> \d+
 public | tuneeca_prd | table | tomcat | 8192 bytes | 
 public | tuneeca_stg | table | tomcat | 1464 kB    | 
Run Code Online (Sandbox Code Playgroud)

只适用于psql.

(@ zkutch答案摘要.)

  • 如果需要同时查看表和索引,`\ dti +`就可以了. (26认同)

小智 22

如果数据库名称是snort,则以下句子给出它的大小:

psql snort -c "\l+" | grep snort | awk -F "|" '{print $7}'
Run Code Online (Sandbox Code Playgroud)

  • 到目前为止,最简单的答案是快速查看大小.我把它放在shell函数``dbsize``中. (2认同)

Gre*_*ith 10

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


Ahm*_*OUR 10

Tyr :(索引大小/使用情况统计)

SELECT
    t.tablename,
    indexname,
    c.reltuples AS num_rows,
    pg_size_pretty(pg_relation_size(quote_ident(t.tablename)::text)) AS table_size,
    pg_size_pretty(pg_relation_size(quote_ident(indexrelname)::text)) AS index_size,
    CASE WHEN indisunique THEN 'Y'
       ELSE 'N'
    END AS UNIQUE,
    idx_scan AS number_of_scans,
    idx_tup_read AS tuples_read,
    idx_tup_fetch AS tuples_fetched
FROM pg_tables t
LEFT OUTER JOIN pg_class c ON t.tablename=c.relname
LEFT OUTER JOIN
    ( SELECT c.relname AS ctablename, ipg.relname AS indexname, x.indnatts AS number_of_columns, idx_scan, idx_tup_read, idx_tup_fetch, indexrelname, indisunique FROM pg_index x
           JOIN pg_class c ON c.oid = x.indrelid
           JOIN pg_class ipg ON ipg.oid = x.indexrelid
           JOIN pg_stat_all_indexes psai ON x.indexrelid = psai.indexrelid )
    AS foo
    ON t.tablename = foo.ctablename
WHERE t.schemaname='public'
ORDER BY 1,2;
Run Code Online (Sandbox Code Playgroud)


Cig*_*ges 7

仅供参考,我从@aib 那里得到了很好的答案,并对其进行了一些修改:

  • 仅从“公共”模式中获取表
  • 还显示物化视图数据和索引大小

在物化视图上,我们可以使用索引同时刷新物化视图,这允许在更新时使用它们。

好吧,我的查询如下:

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 (
        -- tables from 'public'
        SELECT table_name
        FROM information_schema.tables
        where table_schema = 'public' and table_type = 'BASE TABLE'
        union
        -- materialized views
        SELECT oid::regclass::text as table_name
        FROM pg_class
        WHERE relkind = 'm'
        order by table_name
    ) AS all_tables
    -- ORDER BY total_size DESC
    order by table_name
) AS pretty_sizes
Run Code Online (Sandbox Code Playgroud)