Besoin d'index sur les clés étrangères

30

Je me bats avec les index, les clés primaires et les clés étrangères ... Et la nécessité de les avoir tous.

Si j'ai deux tables, les deux ont un entier comme clé primaire.
La première table fait référence via un FK à la clé primaire de la deuxième table.

  • Sur les deux tables, j'ai un index de clé primaire sur la colonne ID
  • J'ai créé une contrainte FK sur le table1.ref_fieldréférencement du PK de la deuxième table ( table2.id)
  • et j'ai ajouté un index sur table1.ref_field

Est-ce la meilleure façon d'organiser ces index, clés primaires et étrangères?

stUrb
la source

Réponses:

30

Votre design est bon. Si vous rencontrez un problème de performances (que vous ne pouvez pas connaître au moment du design), vous devez créer un index sur la colonne table1.ref_field, dans le même ordre (ASC) que la colonne table2.id. Cela améliorera les performances des jointures entre celles-ci et les tables / colonnes. Il y a des frais généraux pour maintenir n'importe quel indice, donc vous voulez peser ce coût contre l'avantage d'une amélioration des performances.

PostgreSQL ne crée pas automatiquement de tels index sur les colonnes de clés étrangères qui font référence à d'autres colonnes, malheureusement, vous devez donc le faire vous-même.

Voici une question StackOverflow sur le même sujet:

Postgres et index sur les clés étrangères et les clés primaires

Voici une requête pour vous aider à déterminer où vous pourriez bénéficier de l'ajout d'un tel index:

Postgresql: Index sur les clés étrangères

peterk411
la source
Ce n'est pas toujours malheureux - si vous ne le faites pas DELETEdans la table référencée, cela peut vous faire économiser beaucoup d'E / S et de CPU en évitant de maintenir un index inutilisé. Je pense qu'il devrait être créé par défaut, juste avoir une option pour supprimer sa création.
Craig Ringer
Craig Ringer Non seulement SUPPRIMER peut avoir un impact sur cela, si vous avez choisi entre les tables partent et enfant, vous aurez également des problèmes de performances. Cette documentation d'Oracle explique plus: asktom.oracle.com/pls/asktom/…
777 Non