C'est certainement. Nous avons discuté de cela en détail sous cette question connexe:
L'espace est alloué en multiples de MAXALIGN
, ce qui correspond généralement à 8 octets sur un système d'exploitation 64 bits ou (beaucoup moins commun) à 4 octets sur un système d'exploitation 32 bits. Si vous n'êtes pas sûr, vérifiez pg_controldata
. Cela dépend également des types de données des colonnes indexées (certaines nécessitent un remplissage d'alignement) et du contenu réel.
Un index sur, par exemple, deux integer
colonnes (4 octets chacune) finit généralement par être exactement aussi grand qu'un index sur une seule colonne, où 4 octets supplémentaires sont perdus pour le remplissage d'alignement.
Dans ce cas, le planificateur de requêtes n'a pas d'inconvénient à utiliser un index (a,b)
, comparé à un index (a)
. Et il est généralement préférable que plusieurs requêtes utilisent le même index. La chance pour qu'il (ou une partie de celui-ci) réside dans le cache (rapide) augmente quand il est partagé.
Si vous maintenez déjà un index activé (a,b)
, il n’a aucun sens de créer un autre index uniquement (a)
- à moins qu’il soit nettement plus petit. La même chose est pas vrai pour les (b,a)
contre (a)
. Suivez le lien à la première ligne pour en savoir plus.
En venant de la direction opposée, lorsque vous avez besoin d'un index supplémentaire comme celui-ci (a,b)
, envisagez de supprimer un index existant uniquement (a)
- si possible. Souvent impossible car il s'agit de l'index d'une PK ou d'une UNIQUE
contrainte. Depuis Postgres 11, vous pouvez vous contenter d’ajouter b
à la définition de la contrainte avec la INCLUDE
clause. Détails dans le manuel.
Ou créez le nouvel index sur (b,a)
pour couvrir les requêtes b
supplémentaires. Pour les seules conditions d'égalité, l'ordre des expressions d'index dans les index btree n'a pas d'importance. C'est le cas, cependant, lorsqu'il s'agit de conditions de distance. Voir:
L' inclusion de colonnes supplémentaires dans un index peut présenter des inconvénients , même si cet espace utilise uniquement de l'espace, sinon perdu par l'alignement de remplissage:
- Chaque fois que la colonne supplémentaire est mise à jour, l'index a également besoin d'une mise à jour, ce qui peut entraîner des coûts supplémentaires pour les opérations d'écriture et créer davantage de blocages d'index.
- HOT mises à jour (Tas uniquement Tuple) sur la table ne sont pas possibles en une colonne d'index est impliqué.
Plus sur les mises à jour HOT:
Comment mesurer la taille des objets: