On a besoin parfois d'avoir rapidement la taille sur disque d'une table et le nombre d'enregistrements qu'elle contient. Pour cela, on peut utiliser la fonction pg_total_relation_size('nom de table')
qui permet de rapatrier la taille totale de la table sur disque, index inclus. Si on ne veut pas connaître la taille prise par les index, il suffit d'utiliser la fonction pg_relation_size('nom de table')
. La soustraction des deux permet de connaître la taille des index!
Tout cela nous permet de réaliser une vue fort sympathique pour l'administrateur de base de données. Attention à lancer un ANALYZE avant tout requêtage de cette vue:
drop view vue_stats;
create view vue_stats as
SELECT
c.relname as nom,
c.reltuples::bigint as tuples,
pg_total_relation_size(c.relname) as volume_total,
pg_relation_size(c.relname) as volume_donnees,
pg_total_relation_size(c.relname)-pg_relation_size(c.relname) as volume_index
FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_roles r ON r.oid = c.relowner
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = 'r'
AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1,2;
Merci à klando (Cédric) pour cet ajout, fort sympathique: il permet d'avoir les tailles des objets lisibles sous la forme humaine:
drop view vue_stats_pretty ;
create view vue_stats_pretty as
SELECT
nom,
tuples,
pg_size_pretty(volume_total) as volume_total,
pg_size_pretty(volume_donnees) as volume_donnees,
pg_size_pretty(volume_index) as volume_index
FROM vue_stats;
Enjoy!
--
Jean-Paul ARGUDO
http://dalibo.com | http://dalibo.org