Blog

Blog

Liste et taille des bases, des schémas et des tables en postgreSQL

Lors de la vie d'un projet, il faut suivre un minimum l'évolution des volumétries des différentes bases, schémas et tables. (Notamment la préconisation postgreSQL est de ne pas avoir de table plus grande que la RAM).

Liste et taille des bases d'une intance

La fonction pg_database_size donne la taille d'une base de données en octet. la fonction pg_size_pretty transforme un nombre en octet en utilisant l'unité la plus appropriée pour une lecture humaine.
La table pg_database du catalogue postgreSQL vous donnera la liste des base d'une instance.
Voici donc la requête :
SELECT datname as Nom, 
pg_database_size(datname) as Taille_en_Octets, 
pg_size_pretty(pg_database_size(datname)) as Taille
FROM pg_database
ORDER BY Taille_en_Octets DESC

Liste et taille des tables d'une base de données

La fonction pg_relation_size donne la taille des données d'une table. La fonction pg_total_relation_size donne la taille totale d'une table, en incluant les index et les tables TOAST.
La vue du catalogue information_schema tables donne la liste des tables de la base de données à laquelle vous êtes connecté.

SELECT table_name, 
pg_relation_size(table_schema || '.' || table_name) As Taille_donnees,
pg_total_relation_size(table_schema || '.' || table_name) As Taille_totale
FROM information_schema.tables
ORDER BY Taille_totale DESC
Pour rajouter le nom de la base, il suffit de rajouter la colonne table_catalog.

Liste et taille des schémas d'une base de données

La fonction pg_relation_size donne la taille des données d'une table. La fonction pg_total_relation_size donne la taille totale d'une table, en incluant les index et les tables TOAST.
En sommant toutes ces tailles par schéma, on arrive aux tailles des schémas.
La vue du catalogue information_schema tables donne la liste des tables de la base de données à laquelle vous êtes connecté.

Voici donc la requête à jouer :
SELECT table_schema, 
SUM(pg_relation_size(table_schema || '.' || table_name)) As Taille_donnees,
SUM(pg_total_relation_size(table_schema || '.' || table_name)) As Taille_totale
FROM information_schema.tables
GROUP BY table_schema
ORDER BY Taille_totale DESC
Pour rajouter le nom de la base, il suffit de rajouter la colonne table_catalog.

Lors de ces additions, j'ai eu un souci avec le type de sortie de sum qui ne permettait pas d'appliquer le pg_size_pretty (ne s'applique qu'à un bigint), je propose donc faire une conversion explicite ainsi :
pg_size_pretty(SUM(pg_total_relation_size(table_schema || '.' || table_name))::bigint)