web-dev-qa-db-fra.com

Comprendre où pg_toast vient de

J'ai une bonne quantité de stockage dans pg_toast

             relation             |  size
----------------------------------+---------
 pg_toast.pg_toast_43934449       | 87 GB
 pg_toast.pg_toast_43934438       | 64 GB
 pg_toast.pg_toast_50877          | 35 GB
 pg_toast.pg_toast_16715          | 15 GB
 pg_toast.pg_toast_16813          | 13 GB
 pg_toast.pg_toast_5706469        | 1335 MB
 pg_toast.pg_toast_43934449_index | 1004 MB
 pg_toast.pg_toast_43934438_index | 942 MB
 pg_toast.pg_toast_16715_index    | 709 MB
 pg_toast.pg_toast_16813_index    | 548 MB
 pg_toast.pg_toast_50877_index    | 530 MB
 pg_toast.pg_toast_3518414        | 463 MB
 pg_toast.pg_toast_16994          | 339 MB
 pg_toast.pg_toast_46608          | 310 MB
 pg_toast.pg_toast_16994_index    | 92 MB
 pg_toast.pg_toast_22345124       | 68 MB
 pg_toast.pg_toast_46608_index    | 51 MB
 pg_toast.pg_toast_437018         | 43 MB
 pg_toast.pg_toast_5706469_index  | 15 MB
 pg_toast.pg_toast_3518414_index  | 13 MB
(20 rows)

Ce qui est important lorsque la taille totale de la DB est actuellement d'environ 420 Go. Ceci est totalement attendu car certaines de mes tables stockent JSON comme étant text type (pour certaines de mes tables plus anciennes) ou jsonb pour certains des plus récents.

Beaucoup de ces colonnes peuvent être nettoyées au niveau de l'application en supprimant simplement des données plus anciennes. Le problème est qu'il est difficile de savoir ce qui contribue réellement aux tables pg_toast?

Comment puis-je revers-trace A PG_Toast à la référence de la ligne/colonne réelle d'une autre table?

3
leonsas

Vous pouvez utiliser cette requête pour trouver toutes les tables avec des tables de toast:

SELECT oid::regclass,
       reltoastrelid::regclass,
       pg_relation_size(reltoastrelid) AS toast_size
FROM pg_class
WHERE relkind = 'r'
  AND reltoastrelid <> 0
ORDER BY 3 DESC;

Pour savoir laquelle des colonnes du tableau consomme la plupart des espaces, vous pouvez essayer une requête comme

SELECT sum(length(col1)) AS col1_size,
       sum(length(col2)) AS col2_site
FROM some_table;

Ici col1 et col2 serait text, varchar, char ou bytea colonnes, qui sont généralement les plus grandes. Avec d'autres types de données tels que jsonb, vous pourriez lancer à text pour obtenir une estimation.

6
Laurenz Albe