liste postgresql et classement des tables par taille

109

Comment puis-je lister toutes les tables d'une base de données PostgreSQL et les classer par taille ?

rien de spécial ici
la source
1
Si vous utilisez le client psql en ligne de commande, un simple \d+vous montrera ces informations, bien que non triées.
cdhowie
1
Merci. Mais j'en ai besoin trié, j'ai trop de tables.
rien de spécial ici
1
Les personnes recherchant la même chose mais des bases de données au lieu de tables: voici la solution .
Skippy le Grand Gourou
1
Re psql: démarrez-le avec --echo-hidden et il vous indiquera les requêtes effectuées pour \ d + et d'autres commandes anti-slash. Facile à ajouter du tri.
Jürgen Strobel

Réponses:

149
select table_name, pg_relation_size(quote_ident(table_name))
from information_schema.tables
where table_schema = 'public'
order by 2

Cela vous montre la taille de toutes les tables du schéma publicsi vous avez plusieurs schémas, vous pouvez utiliser:

select table_schema, table_name, pg_relation_size('"'||table_schema||'"."'||table_name||'"')
from information_schema.tables
order by 3

Exemple SQLFiddle: http://sqlfiddle.com/#!15/13157/3

Liste de toutes les fonctions de taille d'objet dans le manuel .

un cheval sans nom
la source
C'est table_schema, pas schema_name. La première requête était correcte mais vous aviez déjà commencé à taper quelque chose dans votre session psql, ce qui a provoqué une erreur de syntaxe.
yieldsfalsehood
OK ce code fonctionne: select table_schema, table_name, pg_relation_size(table_schema||'.'||table_name) from information_schema.tables order by 3; merci pour l'aide!
rien-de spécial-ici
une idée de ce que cela ne fonctionne pas dans mon cas? stackoverflow.com/questions/40977776/…
Juan Carlos Oropeza
@Sucrenoir: "ne fonctionne pas" n'est pas un message d'erreur Postgres valide. La requête dans ma réponse fonctionne pour moi: rextester.com/KGKPR49004
a_horse_with_no_name
Je n'obtiens aucune ligne lorsque j'exécute la première requête. select * from information_schema.tables where table_schema = 'public';ne produit aucune ligne même si le \dnschéma est public. Peut-être qu'un changement dans 9.5 a causé cela?
chien de berger
71

Cela vous montrera le nom du schéma, le nom de la table, la taille jolie et la taille (nécessaire pour le tri).

SELECT
  schema_name,
  relname,
  pg_size_pretty(table_size) AS size,
  table_size

FROM (
       SELECT
         pg_catalog.pg_namespace.nspname           AS schema_name,
         relname,
         pg_relation_size(pg_catalog.pg_class.oid) AS table_size

       FROM pg_catalog.pg_class
         JOIN pg_catalog.pg_namespace ON relnamespace = pg_catalog.pg_namespace.oid
     ) t
WHERE schema_name NOT LIKE 'pg_%'
ORDER BY table_size DESC;

Je construis ceci sur la base des solutions de la liste de schémas avec des tailles (relatives et absolues) dans une base de données PostgreSQL

Kuchi
la source
21

Ce sera plus clair.

pg_size_pretty(<numeric_value>) - convertit le nombre d'octets en format lisible par l'homme.

pg_database_size(<db_name>)- obtient la taille de la base de données en octets .

pg_total_relation_size(<relation_name>)- obtient la taille totale de la table et son index en octets .

pg_relation_size(<relation_name>)- obtient la taille de la relation (table / index) en octets .

pg_index_size(<relation_name>)- obtient la taille d'index de la relation en octets .

current_database() - obtient la base de données actuellement utilisée sur laquelle cette requête est exécutée.

Requete:

select current_database() as database,
       pg_size_pretty(total_database_size) as total_database_size,
       schema_name,
       table_name,
       pg_size_pretty(total_table_size) as total_table_size,
       pg_size_pretty(table_size) as table_size,
       pg_size_pretty(index_size) as index_size
       from ( select table_name,
                table_schema as schema_name,
                pg_database_size(current_database()) as total_database_size,
                pg_total_relation_size(table_name) as total_table_size,
                pg_relation_size(table_name) as table_size,
                pg_indexes_size(table_name) as index_size
                from information_schema.tables
                where table_schema=current_schema() and table_name like 'table_%'
                order by total_table_size
            ) as sizes;

Résultat:

 database  | total_database_size | schema_name | table_name | total_table_size | table_size | index_size
-----------+---------------------+-------------+------------+------------------+------------+------------
 vigneshdb | 1586 MB             | corpdata    | table_aaa  | 16 kB            | 0 bytes    | 8192 bytes
 vigneshdb | 1586 MB             | corpdata    | table_bbb  | 24 kB            | 0 bytes    | 16 kB
 vigneshdb | 1586 MB             | corpdata    | table_ccc  | 640 kB           | 112 kB     | 488 kB
 vigneshdb | 1586 MB             | corpdata    | table_ddd  | 9760 kB          | 3152 kB    | 6568 kB
 vigneshdb | 1586 MB             | corpdata    | table_eee  | 1120 MB          | 311 MB     | 808 MB

Le format est humanisé représente dans bytes, kB, MB, GBet TB.

bytesà kB- commence à partir de10240 bytes

bytesà MB- commence à partir de 10485248 bytes= 10239.5 kB~10 MB

bytesà GB- commence à partir de 10736893952 bytes= 10239.5 MB~10 BG

bytesà TB- commence à partir de 10994579406848 bytes= 10239.5 GB~10 TB

Toutes les conversions d'unités commencent à partir de 10 + <unit>.

Pour référence - Documentation officielle Postgres

Vignesh Raja
la source
Cet exemple ne fonctionne pas avec les noms de table en majuscules
Ivan Sveshnikov
4
select table_name,n_live_tup, pg_size_pretty(pg_relation_size(table_name))
from information_schema.tables
inner join pg_stat_user_tables  on table_name=relname
where table_schema = 'public'
order by 2 desc

Une autre alternative

Lauri Lüüs
la source
2

J'avais besoin de trouver les tables qui utilisent le plus d'espace.

Sur la base d'autres réponses, j'ai utilisé cette requête:

select table_name, pg_size_pretty( pg_relation_size(quote_ident(table_name)) )
from information_schema.tables
where table_schema = 'public'
order by pg_relation_size(quote_ident(table_name)) desc

J'obtiens le résultat suivant:

table_name              pg_size_pretty
--------------------------------------
trade_binance           96 GB
closs_v2_binance_stash  46 GB
closs_bitfinex_stash    5725 MB
trade_bitfinex          5112 MB
...
api_requests            0 bytes
trade_huobi             0 bytes

J'aurais dû acheter un SSD plus gros.

Benjamin Crouzier
la source
1
 select uv.a tablename, pg_size_pretty(uv.b) sizepretty 
 from (select tb.tablename a, pg_table_size('schemaname.'||tb.tablename::text) b 
        from pg_tables tb 
        where tb.schemaname ilike 'schemaname' 
        order by 2 desc
       ) uv
Pointe
la source
1
Votre réponse serait plus précieuse si vous incluez une explication des raisons pour lesquelles l'approche suggérée est utile.
Cindy Meister
C'est similaire à la réponse du cheval, il suffit de trier par taille avec jolie car la vue de tri sera facile à regarder.
Spike
Veuillez ajouter ce texte à votre réponse, en utilisant le lien Modifier dans l'espace «Réponse». Ensuite, votre contribution sera conforme aux directives de StackOverflow (lisez un peu dans le centre d'aide) :-)
Cindy Meister