2010-11-16 5 views
2

J'ai une table [table] avec deux colonnes qui doit être filtrée: [colonne1] et [colonne2].Optimisation des index de plusieurs colonnes pour plusieurs requêtes de colonnes sur SQL Server

Dans mon programme, j'exécutons une requête comme:

select * from [table] where [column1] = 'foo' and [column2] = 'bar'; 

Ce qui est plus rapide:

  1. Création de deux index, un sur chaque colonne. ([column1] et [column2])
  2. Création d'un index contenant les deux colonnes. ([column1] + [column2])

Cette question m'inquiète depuis un moment, je ne sais pas comment fonctionne l'optimisation des requêtes et comment SQL Server utilise les index créés pour accélérer les requêtes.

Répondre

3

La deuxième est toujours plus rapide pour cette requête - mais vous avez besoin de mettre une plus sélective premier (dans l'ordre des indices) de bénéficier plus. La seule exception est si, pour des raisons de performances, SQL décide d'utiliser l'index clusterisé, de sorte qu'il ignore les non-cluster.

La combinaison de deux valeurs crée un critère beaucoup plus sélectif. En outre, il aide à la performance car il n'y a pas BOOKMARK LOOKUP requis sur un indice de couverture.

Les recherches de signets sont la source d'une dégradation majeure des performances et c'est pourquoi l'index de couverture est toujours meilleur que 2 index.

MISE À JOUR

Gardez à l'esprit, si vous avez votre index comme colonne1 + coulmn2, les recherches sur tout colonne2 ne peut pas utiliser cet index de sorte que vous aurez besoin d'un index séparé sur colonne2 ainsi.

3

Cela dépend!

Cela dépend de la sélectivité de ces colonnes. Si vous étiez et non en sélectionnant toutes les colonnes '*', vous pourriez utiliser un index de recouvrement très rapide, composé des colonnes clause where et INCLUANT les colonnes de la liste SELECT.

Questions connexes