2011-08-04 3 views
0

J'ai une table Person avec les colonnes personId, teamId, departmentId, parmi d'autres. La plupart de la requête utilise une combinaison de ces colonnes sur l'emplacement.SQL Server: index multiple pour les mêmes performances de colonnes

Exemple

Select * from .. where personId = 2 and departementId = 1 
Select * from .. where personId = 2 and teamId = 1 
Select * from .. where departmentId = 2 and teamId = 1 

Ma question est, dois-je créer un index pour chacune de ces colonnes individuellement?

+0

La requête réelle n'est pas une sélection *. Je viens de mettre cela comme exemple – roncansan

Répondre

2

La réponse rapide est oui - il suffit d'ajouter un index pour chaque colonne. Il est peu probable que ce soit la solution la plus optimale, mais dans la plupart des cas, elle ne sera pas si éloignée et ne causera probablement aucun dommage, sauf si vous avez déjà plusieurs index sur cette table.

La seule un peu plus longue réponse est que vous devez essai votre requête sur données représentatives - Le SQL Server Database Engine Tuning Advisor pouvez suggérer des index pour vous, mais seulement vous pouvez vérifier pour vous assurer que ces indices sont appropriés pour d'autres toutes les requêtes (y compris les insertions/mises à jour) - vous devez équilibrer les performances des lectures par rapport au coût de maintenance de ces index lors de l'écriture dans la base de données (ainsi que des contraintes de stockage/espace).

1

Sans prendre en compte l'ensemble de votre charge de travail de requête, la meilleure réponse est difficile à donner.

Si vous sélectionnez réellement toutes les colonnes (*) dans ces requêtes, la création d'index de couverture n'est pas vraiment pratique, alors une réponse est oui, créez des index de colonne unique sur ces colonnes.

Vous pouvez également créer des index sur:

1) personId et departmentId

2) personId et teamId

3) departmentId et teamId

L'avantage de créer de nombreux indices plutôt que peu dépend beaucoup de votre rapport lecture-écriture. De plus, sur quoi votre index cluster est-il défini? Si votre requête n'est pas un SELECT * (comme vous le mentionnez dans les commentaires à votre question), alors si la liste de colonnes sélectionnée n'était pas trop longue, vous pourriez probablement créer des index de couverture efficaces.

Le conseiller d'optimisation de base de données a été mentionné; il fait du bon travail, mais il y a des choses à considérer dans ses recommandations.

+0

L'index clusterisé est défini sur person.id. – roncansan

2

Soit une par colonne: SQL Server utilisera Index Intersection

Ou, essayer quelque chose comme ceci: trois indices composites. La première colonne de chacun est utile comme "index de colonne unique" aussi.

  • departmentId, teamId, personId
  • personId, departmentId, teamId
  • teamId, personId, departmentId

Notes:

  • où l'ordre de la clause n'a pas d'importance
  • SELECT * est mauvais

En outre, il est une bonne idée d'avoir des colonnes clés étrangères indexées et soit la stratégie fonctionnera

0

Je ne voudrais pas, en règle générale, de créer 3 indices sur les variations de l'utilisation sur le terrain, mais qui est juste un général règle.

En ce qui concerne la réponse «Comment faire ceci en tant que débutant», je créerais une charge de travail et utiliserais le conseiller en optimisation. Ce n'est pas une solution finale, et quand quelqu'un apprend plus, il dépasse le magicien, mais c'est un bon point de départ. Assurez-vous d'avoir un échantillon représentatif décent, car les index peuvent détruire les performances sur d'autres requêtes, si elles ne sont pas effectuées correctement.

+2

"les index peuvent détruire les performances sur d'autres requêtes" - bit d'une instruction de balayage. Oui, cela peut avoir un impact sur INSERTS, mais même les insertions doivent trouver le point d'insertion .... –

+0

@Mitch Wheat: +1 Chaque DML est une lecture, que ce soit pour trouver la ligne, vérifier l'unicité, vérifier un FK. Je ne suis pas vraiment abonné à la théorie des «trop nombreux index» – gbn

+0

@gbn - vous pouvez avoir un problème quand vous avez beaucoup de chevauchement, cependant. Si vous mettez à jour un champ dans 3 index différents, vous commencez à multiplier les effets négatifs. – JNK

Questions connexes