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 ?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top