How do you find the disk size of a Postgres / PostgreSQL table and its indexes

前端 未结 9 2110
甜味超标
甜味超标 2020-12-02 03:42

I\'m coming to Postgres from Oracle and looking for a way to find the table and index size in terms of bytes/MB/GB/etc, or even better the size for all tables.

相关标签:
9条回答
  • 2020-12-02 04:24

    Show database sizes:

    \l+

    e.g.

    => \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 | 
    

    Show table sizes:

    \d+

    e.g.

    => \d+
     public | tuneeca_prd | table | tomcat | 8192 bytes | 
     public | tuneeca_stg | table | tomcat | 1464 kB    | 
    

    Only works in psql.

    (Summary of @zkutch's answer.)

    0 讨论(0)
  • 2020-12-02 04:28

    check this wiki. https://wiki.postgresql.org/wiki/Disk_Usage

    SELECT *, pg_size_pretty(total_bytes) AS total
        , pg_size_pretty(index_bytes) AS INDEX
        , pg_size_pretty(toast_bytes) AS toast
        , pg_size_pretty(table_bytes) AS TABLE
      FROM (
      SELECT *, total_bytes-index_bytes-COALESCE(toast_bytes,0) AS table_bytes FROM (
          SELECT c.oid,nspname AS table_schema, relname AS TABLE_NAME
                  , c.reltuples AS row_estimate
                  , pg_total_relation_size(c.oid) AS total_bytes
                  , pg_indexes_size(c.oid) AS index_bytes
                  , pg_total_relation_size(reltoastrelid) AS toast_bytes
              FROM pg_class c
              LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
              WHERE relkind = 'r'
      ) a
    ) a
    
    0 讨论(0)
  • 2020-12-02 04:29

    Try the Database Object Size Functions. An example:

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

    For all tables, something along the lines of:

    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;
    

    Edit: Here's the query submitted by @phord, for convenience:

    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;
    

    I've modified it slightly to use pg_table_size() to include metadata and make the sizes add up.

    0 讨论(0)
提交回复
热议问题