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

前端 未结 9 2109
甜味超标
甜味超标 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:13

    If the database name is snort, the following sentence give it size:

    psql -c "\l+ snort" | awk -F "|" '{print $7}'
    
    0 讨论(0)
  • 2020-12-02 04:14

    PostgreSQL tables have three components: the table itself, any indexes on it, and potentially TOAST data. There's a couple of examples showing how to slide and dice the available information various ways at http://wiki.postgresql.org/wiki/Disk_Usage

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

    Tyr this : (Index size/usage statistics)

    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;
    
    0 讨论(0)
  • 2020-12-02 04:18

    Try this script to find all table size:

    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
    

    For other different script to find size in PostgreSQL, Please visit this url: http://www.dbrnd.com/2015/05/how-to-find-size-of-database-and-table-in-postgresql/

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

    Just for info, I have got the excelent answer from @aib and modified it a little for:

    • getting only tables from "public" schema
    • show also materialized views data and index size

    On materialized view we can use index for refreshing materialized views concurrently, which allows using them while updating.

    Well, my query will be the following:

    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
    
    0 讨论(0)
  • 2020-12-02 04:23

    The Query below will serve you

    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;
    

    See this Link: https://wiki.postgresql.org/wiki/Disk_Usage

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