Comment l'optimiseur de requête SQL Server choisit-il les index non groupés à partir d'index disponibles pour une table particulière?

J'ai suivi les index non groupés pour la table serviceregistration .

 Index Name ---------------+ Column Name ----------------- + Index Type IX_SERVICEREGISTRATION_I | SERREGNO | NONCLUSTERED IX_SERVICEREGISTRATION_II | SERREGNO, SERCUSTID | NONCLUSTERED IX_SERVICEREGISTRATION_III| PLACEID, JOBID, SERREGNO | NONCLUSTERED 

Requête 1:

 Select CustomerName, Place From dbo.ServiceRegistration Where SERREGNO = 'JAN1234' And PLACEID = 1 

Requête 2:

 Select CustomerName, Place From dbo.ServiceRegistration Where SERREGNO = 'JAN1234' And SERCUSTID = 'A123' 

Requête 3:

 Select CustomerName, Place From dbo.ServiceRegistration Where JOBID = 5 And PLACEID = 1 And SERREGNO = 'JAN1234' 

Si les index créés ci-dessus seront utiles pour ces requêtes ou non?

  • La requête n ° 1 peut utiliser IX_SERVICEREGISTRATION_I
  • La requête # 2 peut utiliser IX_SERVICEREGISTRATION_II
  • La requête n ° 3 peut utiliser l'index n ° 3

Tout index composé (composé de plusieurs colonnes) ne peut jamais être utilisé que si vous utilisez les n colonnes les plus à gauche dans vos requêtes – c'est pourquoi ni la requête # 1 ni la requête # 2 ne peuvent utiliser l'index # 3.

Mais l'utilisation réelle des indices dépendra de beaucoup plus de choses – comme combien de lignes sur l'set du tableau select-vous avec cette requête?

Aucune des requêtes n'est "couverte" par et index – par exemple, aucune requête ne peut returnner les valeurs que vous requestz en regardant simplement l'index – ce qui limite généralement l'utilité d'un index. Si vous ajoutez un INCLUDE (CustomerName, Place) à l'un des index, la probabilité de leur utilisation sera considérablement améliorée.