PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

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

PostgreSQL crée automatiquement des index sur les clés primaires et les contraintes uniques, mais pas du côté du référencement des relations de clé étrangère.

Lorsque Pg crée un index implicite, il émet un NOTICE message de niveau que vous pouvez voir dans psql et/ou les journaux système, afin que vous puissiez voir quand cela se produit. Les index créés automatiquement sont visibles dans \d sortie pour une table également.

La documentation sur les index uniques indique :

PostgreSQL crée automatiquement un index pour chaque contrainte unique et contrainte de clé primaire pour renforcer l'unicité. Ainsi, il n'est pas nécessaire de créer un index explicitement pour les colonnes de clé primaire.

et la documentation sur les contraintes dit :

Étant donné qu'un DELETE d'une ligne de la table référencée ou une mise à jour d'une colonne référencée nécessitera un balayage de la table de référence pour les lignes correspondant à l'ancienne valeur, il est souvent judicieux d'indexer les colonnes de référence. Parce que ce n'est pas toujours nécessaire et qu'il existe de nombreux choix disponibles sur la façon d'indexer, la déclaration d'une contrainte de clé étrangère ne crée pas automatiquement un index sur les colonnes de référence.

Par conséquent, vous devez créer vous-même des index sur les clés étrangères si vous le souhaitez.

Notez que si vous utilisez des clés étrangères primaires, comme 2 FK comme PK dans une table M-à-N, vous aurez un index sur le PK et n'aurez probablement pas besoin de créer d'index supplémentaires.

Bien que ce soit généralement une bonne idée de créer un index sur (ou incluant) vos colonnes de clé étrangère côté référence, cela n'est pas obligatoire. Chaque index que vous ajoutez ralentit légèrement les opérations DML, vous payez donc un coût de performance sur chaque INSERT , UPDATE ou DELETE . Si l'index est rarement utilisé, il ne vaut peut-être pas la peine de l'avoir.