Postgres place-t-il automatiquement des index sur les clés étrangères et les clés primaires? Comment savoir? Existe-t-il une commande qui retournera tous les index d'une table?
la source
Postgres place-t-il automatiquement des index sur les clés étrangères et les clés primaires? Comment savoir? Existe-t-il une commande qui retournera tous les index d'une table?
PostgreSQL crée automatiquement des index sur les clés primaires et les contraintes uniques, mais pas sur le côté de référencement des relations de clés étrangères.
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 également visibles dans la \d
sortie d'une table.
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é que la suppression d'une ligne de la table référencée ou la mise à jour d'une colonne référencée nécessitera une analyse 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. Étant donné que cela 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.
Notez que si vous utilisez des clés étrangères primaires, comme 2 FK en tant que PK dans une table M-to-N, vous aurez un index sur le PK et vous 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érencement, ce 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 pour chaque INSERT
, UPDATE
ou DELETE
. Si l'index est rarement utilisé, cela ne vaut peut-être pas la peine.
Si vous souhaitez lister les index de toutes les tables de vos schémas de votre programme, toutes les informations sont à portée de main dans le catalogue:
Si vous souhaitez approfondir (comme les colonnes et la commande), vous devez regarder pg_catalog.pg_index. L'utilisation
psql -E [dbname]
est utile pour déterminer comment interroger le catalogue.la source
\di
, tous les index de la base de données seront également répertoriés." (le commentaire copié de l'autre réponse s'applique ici également)Cette requête répertorie les index manquants sur les clés étrangères , source d'origine .
Edit : Notez qu'il ne vérifiera pas les petites tables (moins de 9 Mo) et certains autres cas. Voir
WHERE
déclaration finale .la source
where
clauses: Entre autres, il ne prend en compte que les tableaux dont la taille est supérieure à 9 Mo.Oui - pour les clés primaires, non - pour les clés étrangères (plus dans la documentation ).
dans "psql" montre une description d'une table incluant tous ses index.
la source
J'adore la façon dont cela est expliqué dans l'article Fonctionnalités de performances intéressantes d'EclipseLink 2.5
la source
Pour a
PRIMARY KEY
, un index sera créé avec le message suivant:Pour une
FOREIGN KEY
, la contrainte ne sera pas créé s'il n'y a pas d' index sur la référe ed table.Un index sur référe ING table n'est pas nécessaire (si désiré), et ne sera donc pas implicitement créé.
la source