postgresql - comment et pourquoi les index sont plus grands que leurs tables
-
26-09-2020 - |
Question
J'utilise postgresql 9.3 et j'essaie de comprendre comment et pourquoi les index sont plus grands que leurs tables.
Exemple de sortie :
database_name | database_size | table_name | table_size | indexes_size | total_size
---------------+---------------+--------------------------------------------------------------+------------+--------------+------------
foo_12345 | 412 MB | "foobar_dev_12345"."fact_mobile_sends" | 57 MB | 131 MB | 189 MB
foo_12345 | 412 MB | "foobar_dev_12345"."fact_mobile_started" | 17 MB | 39 MB | 56 MB
foo_12345 | 412 MB | "foobar_dev_12345"."fact_mobile_stopped" | 16 MB | 35 MB | 51 MB
J'exécute la requête suivante pour obtenir les tailles de table et d'index.
SELECT
table_catalog AS database_name,
pg_size_pretty(pg_database_size(current_database())) As database_size,
table_name,
pg_size_pretty(table_size) AS table_size,
pg_size_pretty(indexes_size) AS indexes_size,
pg_size_pretty(total_size) AS total_size
FROM (
SELECT
table_catalog,
pg_database_size(current_database()) AS database_size,
table_name,
pg_table_size(table_name) AS table_size,
pg_indexes_size(table_name) AS indexes_size,
pg_total_relation_size(table_name) AS total_size
FROM (
SELECT ('"' || table_schema || '"."' || table_name || '"') AS table_name, table_catalog
FROM information_schema.tables
) AS all_tables
ORDER BY total_size DESC
) AS pretty_sizes;
Ma requête est-elle correcte ?Qu’est-ce qui ferait en sorte que les index soient plus gros ?
La solution
Raisons possibles:
Index nombreux et probablement superposés sur la table ;jetez un oeil avec
\d
Le gonflement dû à un taux de désabonnement élevé des mises à jour peut parfois affecter davantage les index que les tables, en fonction des modèles de mise à jour.Examinez la taille de chaque index individuel pour voir si cela a du sens.
Les index GiST, s'ils sont utilisés, peuvent être assez volumineux
Contrairement à ce que je pensais au départ pas un problème avec TOAST
le stockage hors ligne n'est pas pris en compte, car pg_table_size
comprend TOAST
les tables.
Notez que si vous êtes préoccupé par le gonflement de l'index et décidez de REINDEX
certains de tous les index impliqués, envisagez de définir un paramètre autre que celui par défaut FILLFACTOR
d'abord si la table est soumise à de nombreuses mises à jour (ou insertions+suppressions).Sinon, vous subirez une baisse des performances d'écriture car l'index ne dispose pas d'espace pour insérer de nouvelles valeurs, il forcera donc de nombreuses divisions de pages et sera structuré moins efficacement.