Ce chapitre explique comment surveiller l'utilisation des disques
faite par PostgreSQL™.
26.1. Déterminer l'utilisation des disques
Chaque table possède un fichier principal dans lequel la majorité
des données sont stockées. Si la table contient des colonnes
pouvant recevoir des valeurs étendues, il existe aussi un fichier
TOAST associé à la table. Ce
fichier permet de stocker les valeurs trop larges pour tenir dansle
table principale (voir la Section 52.2,
« TOAST »). Si la table TOAST existe, un index lui est associé. Des
index peuvent également être associés à la table de base. Chaque
table ou index est stocké dans un fichier distinct -- ou plusieurs
si la taille du fichier dépasse 1 Go. Les conventions de nommage de
ces fichiers sont décrites dans la Section 52.1,
« Emplacement des fichiers de la base de données ».
L'espace disque peut être surveillé de trois façons différentes :
depuis psql en utilisant les
informations retournées par
VACUUM
, depuis psql avec les outils de contrib/dbsize et en ligne de commande avec les
outils de contrib/oid2name.
Les fonctions SQL sont les plus faciles à utilise. Elles rapporte
des informations concernant les tables, les tables avec index et
stockage de valeurs étendues (TOAST), les bases de données et les
tablespaces
.
L'utilisation de psql sur une base
de données récemment « nettoyée » (
VACUUM
) ou « analysée »
(
ANALYZE
) permet de
lancer des requêtes pour connaître l'occupation disque d'une table
:
SELECT relfilenode, relpages FROM pg_class WHERE relname = 'customer';
relfilenode | relpages
-------------+----------
16806 | 60
(1 ligne)
Chaque page utilise typiquement 8 Ko d'espace disque.
relpages
n'est mis à jour que
par les commandes
VACUUM
,
ANALYZE
et par quelques commandes
de définition de données (DDL, Data Definition Language), telles
que
CREATE INDEX
. La
valeur de
relfilenode
est
intéressante pour l'examen direct du fichier de table.
Pour connaître l'espace disque utilisé par les tables
TOAST, on utilise une requête
similaire à la suivante :
SELECT relname, relpages
FROM pg_class,
(SELECT reltoastrelid FROM pg_class
WHERE relname = 'customer') ss
WHERE oid = ss.reltoastrelid
OR oid = (SELECT reltoastidxid FROM pg_class
WHERE oid = ss.reltoastrelid)
ORDER BY relname;
relname | relpages
----------------------+----------
pg_toast_16806 | 0
pg_toast_16806_index | 1
On peut aussi facilement afficher la taille des index :
SELECT c2.relname, c2.relpages
FROM pg_class c, pg_class c2, pg_index i
WHERE c.relname = 'customer'
AND c.oid = i.indrelid
AND c2.oid = i.indexrelid
ORDER BY c2.relname;
relname | relpages
----------------------+----------
customer_id_indexdex | 26
Les tables et les index les plus volumineux sont repérés à l'aide
de la requête suivante :
SELECT relname, relpages FROM pg_class ORDER BY relpages DESC;
relname | relpages
----------------------+----------
bigtable | 3290
customer | 3144
L'utilitaire contrib/oid2name permet de
connaître l'utilisation de l'espace disque. Des exemples
d'utilisation sont repris dans le fichier README.oid2name situé dans le répertoire de
l'utilitaire. On y trouve notamment un script permettant de
connaître l'utilisation de l'espace disque par base de données.