En fait, vous ne devriez pas donner des indices d'index en premier lieu.
Explication
- L'un des objectifs derrière le langage SQL est de séparer le « quoi » du « comment ». En d'autres termes; Vos requêtes devraient indiquer les règles des ensembles de résultats dont vous avez besoin et non les chemins d'accès aux données (ce que font exactement les indices).
- En liant vos requêtes à des index spécifiques, vous perdez la possibilité d'améliorer les performances en ajoutant de meilleurs index. C'est à dire. Vous devez également modifier vos requêtes.
- La plupart des options de conseil sont spécifiques à la plate-forme; vous réduisez la portabilité lorsque vous les utilisez.
- L'optimiseur de requête a été écrit pour prendre en compte tous les index, divers scénarios de jointure, et surtout; des informations statistiques sur les données dans vos tableaux. Même si vous êtes capable de couvrir vous-même toutes ces bases, et de déterminer les indices idéaux à utiliser aujourd'hui; dans 6 mois, la fréquence statistique de certaines valeurs, enregistrements, références dans votre base de données peut avoir changé - et votre sélection d'index peut ne plus être bonne!
Side Note
Si le optimser semble faire un choix stupide pour les index à utiliser; cela justifie généralement une enquête plus approfondie.
- Comme première étape; Les statistiques de votre table sont-elles raisonnablement à jour?
Deuxièmement, assurez-vous que l'optimisateur ne renie pas un indice particulier parce que, en réalité, ledit indice réduit les performances. Par exemple, vous pourriez être tenté de faire une des opérations suivantes:
SELECT Col1, Col2, Col3, ...
FROM Customers WITH (INDEX=IndexByName)
WHERE FistName LIKE 'A%'
SELECT Col1, Col2, Col3, ...
FROM Customers WITH (INDEX=IndexByName)
ORDER BY FirstName
Les conseils d'index semblent parfaitement logique; cependant:
- Si l'index est en cluster, ou un index de couverture: il serait utilisé de toute façon - sans l'indice.
- Si l'index est non-cluster et non-couvert: des recherches de signets sont requises pour chaque enregistrement extrait. Cela entraîne une énorme quantité de frais généraux; en particulier sur l'activité de recherche de disque. Donc, par conséquent, les indices sont un mauvais choix après tout.
Enfin
Je ne suis pas sûr que ce soit le cas; mais votre question n'indique pas qu'il s'agit d'une requête multi-tables complexe. Donc, il peut en fait être aussi trivial que suit?
SELECT Col1, Col2, ...
FROM ATable WITH (INDEX=Index1, INDEX=Index2)
Quelle que soit la situation, il ne doute pas de sens à indice plusieurs index pour une table unique (à moins qu'il soit utilisé à plusieurs reprises avec l'auto-joint). Vous avez dit:
Cela semble bien fonctionner avec SQL Server 2005.
Et je dois demander: Êtes-vous sûr?
Je l'ai essayé; et autant que cela n'a pas causé un message d'erreur - il a sérieusement confondu l'optimiseur. Il a forcé l'optimiseur à traverser la même table deux fois (inutilement) et de joindre les ensembles de résultats les uns aux autres - encourant un énorme frais généraux !!
J'ai fourni une explication plus détaillée pour vous. Indices d'index ne devraient vraiment être utilisés que rarement. (Bien qu'essayer différentes options et forcer temporairement des index spécifiques peut être un excellent outil d'apprentissage.) –