Hoe vind je de schijfgrootte van een Postgres / PostgreSQL-tabel en zijn indexen

Ik kom naar Postgres vanuit Oracle en ben op zoek naar een manier om de tabel- en indexgrootte te vinden in termen van bytes/MB/GB/etc, of nog beter de grootte voor alle tabellen. In Oracle had ik een vervelende lange vraag die naar user_lobs en user_segments keek om een ​​antwoord te geven.

Ik neem aan dat er in Postgres iets is dat ik kan gebruiken in de information_schematabellen, maar ik zie niet waar.


Antwoord 1, autoriteit 100%

Probeer de Functies voor databaseobjectgrootte. Een voorbeeld:

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

Voor alle tabellen, iets in de trant van:

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;

Bewerken: hier is de vraag die door @phord is ingediend, voor het gemak:

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;

Ik heb het enigszins aangepast om pg_table_size()te gebruiken om metadata op te nemen en de formaten op te tellen.


Antwoord 2, autoriteit 60%

Toon databasegroottes:

\l+

bijv.

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

Tabelmaten weergeven:

\d+

bijv.

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

Werkt alleen in psql.

(Samenvatting van @zkutch’s antwoord.)


Antwoord 3, autoriteit 8%

Als de databasenaam snortis, geeft de volgende zin de grootte:

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

Antwoord 4, autoriteit 6%

Probeer dit: (Indexgrootte/gebruiksstatistieken)

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;

5, Autoriteit 4%

PostgreSQL-tabellen hebben drie componenten: de tabel zelf, eventuele indexen en potentieel toastgegevens. Er is een paar voorbeelden die laten zien hoe ze de beschikbare informatie verschillende manieren op


6

Controleer deze wiki. https://wiki.postgresql.org/wiki/disk_usage

Selecteer *, PG_SIZE_PRETTY (Total_Bytes) als totaal
  , pg_size_pretty (index_bytes) als index
  , PG_SIZE_PRETTY (TOAST_BYTES) ALS TOAST
  , pg_size_pretty (tabel_bytes) als tabel
 VAN (
 Selecteer *, totaal_bytes-index_bytes-coalesce (Toast_bytes, 0) als tabel_bytes van (
   Selecteer C.OID, NSPNAME ALS TABEL_SCHEMA, RELNAME ALS TABEL_NAME
       , c.Reltes als row_estimate
       , PG_Total_relation_Size (C.OID) als Total_Bytes
       , pg_indexes_size (C.OID) als index_bytes
       , pg_total_relation_size (reletoastrelid) als toast_bytes
     Van pg_class c
     Links lid worden PG_NAMEPACE N OP N.OID = C.RELNAMEPACE
     Waar relschind = 'r'
 ) een
) een

Other episodes