web-dev-qa-db-fra.com

Comment trouvez-vous la taille de disque d'une table Postgres/PostgreSQL et ses index

Je viens d’Oracle chez Postgres et je cherche un moyen de trouver la taille de la table et de l’index en termes d’octets/Mo/Go/etc., voire d’améliorer la taille de toutes les tables. Dans Oracle, j'avais une longue et méchante requête qui examinait user_lobs et user_segments pour donner une réponse. Je suppose que dans Postgres, je peux utiliser quelque chose dans les tables information_schema, mais je ne vois pas où. Merci d'avance.

132
mmrobins

Essayez les fonctions Database Object Size . Un exemple:

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

Pour toutes les tables, quelque chose comme:

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: Voici la requête soumise par @phord, pour plus de commodité:

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;

Je l'ai légèrement modifié pour utiliser pg_table_size() pour inclure des métadonnées et faire en sorte que les tailles s'additionnent.

229
aib

Afficher les tailles de base de données:

\l+

par exemple.

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

Afficher les tailles de table:

\d+

par exemple.

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

Ne fonctionne que dans psql.

(Résumé de la réponse de @ zkutch .)

163
Hendy Irawan

Si le nom de la base de données est snort, la phrase suivante lui donne la taille:

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

Les tables PostgreSQL ont trois composants: la table elle-même, ses index et éventuellement les données TOAST. Quelques exemples montrent comment glisser et dés les informations disponibles de différentes manières sur http://wiki.postgresql.org/wiki/Disk_Usage

10
Greg Smith

Tyr this: (taille de l’index/statistiques d’utilisation)

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;
9
Ahmed MANSOUR

Juste pour info, j'ai reçu l'excellente réponse de @aib et l'ai modifiée un peu pour:

  • obtenir uniquement des tables du schéma "public"
  • montrer aussi vues matérialisées données et taille d'index 

Sur une vue matérialisée, nous pouvons utiliser index pour actualiser les vues matérialisées simultanément , ce qui permet de les utiliser lors de la mise à jour.

Eh bien, ma requête sera la suivante:

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
1
Ciges

consultez ce 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 schema_table, nom_relatif AS NOM_SEMBLE 
 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 
 relnamespace 
 WHERE relkind = 'r' 
) a 
) a 
0
Uma

La requête ci-dessous vous servira

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;

Voir ce lien: https://wiki.postgresql.org/wiki/Disk_Usage

0
Sajeev