C'est ainsi que l'art des stratégies de réglage et d'indexation des performances entre en scène ...
Il me semble logique de modifier la définition d'index existante pour y inclure les colonnes suggérées
Je vais prendre votre citation et écrire une troisième définition d'index:
create index [idx_index3]
on [table1] (col1, col2, col3)
include (col4, col5, col6....);
Cela devrait être la CREATE INDEX
déclaration qui correspond à votre déclaration citée.
Cela peut très bien être une solution prudente, mais cela dépend . Voici quelques exemples lorsque je dis que cela dépend.
Si vous avez une charge de travail commune composée principalement de requêtes comme celle-ci:
select col1, col2, col3
from table1
where col1 = 1
and col2 = 2
and col3 = 3;
Votre idx_index1
index serait alors solide. Parfaitement étroit, c'est un index qui satisfait cette requête sans aucune donnée étrangère (sans prendre en compte la définition d'index clusterisé, le cas échéant).
Mais si vous avez une charge de travail composée de requêtes comme celle-ci:
select co11, col2, col3, col4, col5
from table1
where col1 = 1
and col2 = 2;
Ce idx_index2
serait alors sage, car c'est ce qu'on appelle un index de couverture, ce qui évite d'avoir à rechercher une clé vers l'index cluster (ou une recherche RID vers le tas). Cette définition d'index non cluster engloberait uniquement toutes les données dont la requête a besoin.
Avec votre recommandation, elle conviendrait parfaitement à une requête comme celle-ci:
select co11, col2, col3, col4, col5
from table1
where col1 = 1
and col2 = 2
and col3 = 3;
Votre idx_index3
recommandation serait un index de couverture qui répond aux critères de recherche pour la requête ci-dessus.
Le point sur lequel j'essaie d'arriver est dans une question isolée comme celle-ci, nous ne pouvons pas y répondre définitivement. Tout dépend de la charge de travail courante et fréquente. Bien sûr, vous pouvez toujours définir ces trois index pour gérer chaque exemple de type de requête, mais cela remet en question la maintenance qui sera nécessaire pour maintenir ces index à jour (pensez: INSERTs, UPDATEs, DELETEs). C'est la surcharge des index.
Vous devez disséquer et évaluer la charge de travail et déterminer où les avantages seront les meilleurs. Si le premier exemple de requête est de loin le plus couramment exécuté des dizaines de fois par seconde, et qu'il existe une requête très rare comme le troisième exemple de requête, il ne serait pas logique de gonfler les pages de niveau feuille de l'index avec le INCLUDE
colonnes non clés. Tout dépend de votre charge de travail.
Si vous comprenez des stratégies d'indexation prudentes et que vous comprenez votre charge de travail commune, alors en appliquant les deux, vous pourrez trouver la meilleure voie à suivre.