Postgres peut utiliser des colonnes non principales dans un index b-tree, mais dans un mode beaucoup moins efficace.
Si la première colonne est très sélective (seulement quelques lignes par A
) alors vous remarquerez à peine une différence de performances car l'une ou l'autre des méthodes d'accès (même une analyse séquentielle sur l'ensemble réduit) est bon marché. L'impact sur les performances augmente avec le nombre de lignes par A
.
Pour le cas que vous décrivez, je suggère de créer l'index sur (A, C, B)
ou (C, A, B)
(assurez-vous simplement que B
vient en dernier) pour optimiser les performances. De cette façon, vous obtenez les meilleures performances pour les requêtes sur (A, B, C)
et sur (A, C)
pareil.
Contrairement à la séquence des colonnes dans l'index, la séquence des prédicats dans la requête n'a pas d'importance.
Nous en avons discuté en détail sur dba.SE :
Notez que ce n'est pas importe si vous dirigez avec A, C
ou C, A
pour le cas présent :
Il y a aussi d'autres considérations, mais votre question ne contient pas tous les détails pertinents.