2010-02-05 7 views
4

J'utilise SQL 2000 et j'exécute une instruction select simple sur une table contenant environ 30 millions de lignes. La requête de sélection ressemble:Optimiser Sélectionner la requête

select col1, col2, col3 from Table1 where [email protected] and [email protected] and [email protected] 

La table a un index ordonné en clusters en elle (par exemple une clé primaire), mais ce n'est pas utilisé comme où les critères. Tous les critères mentionnés ci-dessus ne sont pas indexés en eux.

Comment puis-je optimiser cette requête?

Si j'ajoute des index pour chaque colonne dans la clause where, est-ce que cela ferait une différence?

Si j'ai 10 colonnes dans la clause where, est-ce que toutes ces 10 colonnes devraient avoir un index?

Edit: Ce est probablement l'un de l'entrevue la plus courante question :)

Répondre

5

Oui, cela fera une énorme différence. Au lieu d'ajouter un index pour chaque champ, vous devez ajouter un index qui a les trois champs. (La façon dont ceci est utilisé en pratique dépend bien sûr de l'unicité des champs et des autres requêtes que vous allez utiliser sur la table.)

Notez que l'ajout d'un index a également un impact négatif mineur lorsque vous insérez ou supprimez enregistre dans la table ou met à jour les champs indexés d'un enregistrement.

+0

Index fonctionne comme par magie !! Merci .... mais juste curieux, y at-il d'autres moyens que nous pouvons utiliser pour rendre une telle requête plus rapide? – Bhaskar

+0

@Bhaskar: Oui, vous pouvez aller plus loin. Analysez le plan d'exécution pour voir ce qui prend le plus de temps. L'index le plus efficace dépend des données contenues dans la table et de la quantité modifiée. Si vous avez beaucoup d'insertions/mises à jour/suppressions dans la table, vous devez vérifier la fragmentation de l'index et spécifier un facteur de remplissage si l'index a tendance à être fragmenté. – Guffa

2

Si j'ajouter des index pour chaque colonne la clause where, cela ferait une différence ?

Oui, l'ajout d'un index fera une énorme différence de performance. Cela se fait au prix d'une utilisation importante de l'espace disque par les index et d'un très faible impact sur les commandes INSERT et UPDATE.

Si j'ai 10 colonnes dans la clause where, devrait tous ces 10 colonnes ont index en eux?

Ce n'est pas toujours le cas. Si nous prenons la requête SQL fournie comme exemple et que vous créez un index sur col4 uniquement, il se peut que select * from Table1 where [email protected] ne renvoie que quelques enregistrements. Dans ce cas, vous ne gagnerez pas beaucoup d'avoir un index sur col5 et col6, parce que le moteur de base de données devrait analyser seulement les quelques enregistrements retournés où [email protected].

Par conséquent, comme vous pouvez le voir, cela dépend beaucoup du type de données que vous stockez. En outre, un index peut également ne pas être très utile sur une colonne qui a une faible cardinalité, c'est-à-dire des colonnes avec peu de valeurs uniques.

2

Quelle colonne parmi les critères est la plus sélective? Créer un index sur cette colonne affecterait le plus les performances. Si vous ajoutez d'autres colonnes au même index ou non, cela dépend de la sélectivité. Vous devez examiner les plans de requête pour le trouver :)

4

Comment puis-je optimiser cette requête?

Vous pouvez faire un index couvrant:

CREATE INDEX ix_table1_456__123 ON table1 (col4, col5, col6) INCLUDE (col1, col2, col3) 

et la requête aura même pas de faire une recherche de table. Si j'ajoute des index pour chaque colonne de la clause where, est-ce que cela ferait une différence?

Cela améliorera probablement la requête par rapport à ne pas avoir d'index du tout, mais la création de l'index composite avec couverture sera probablement meilleure.

Cependant, si chacune de vos colonnes a une cardinalité élevée (c'est-à-dire UNIQUE ou proche), la création d'index individuels peut même améliorer la requête par rapport à l'index composite.

Ceci est particulièrement vrai si certaines des colonnes sont de grande taille (comme un VARCHAR(400)) et une autre, petite colonne a une grande cardinalité.

Si j'ai 10 colonnes dans la clause where, est-ce que toutes ces 10 colonnes devraient avoir un index?

Si vous avez 10 colonnes, il y a, comme je l'ai dit plus haut, un compromis entre la taille de clé accrue (qui dégrade la performance) et une sélectivité accrue.

Si, par exemple, les premières colonnes 3 sont uniques ou presque uniques, l'ajout des colonnes supplémentaires n'augmentera pas la sélectivité mais augmentera la taille de la clé.

La taille de l'index augmentera, ce qui nécessitera plus de temps pour y effectuer une recherche.

Vous ne devez pas créer l'index sur toutes les colonnes 10 si les colonnes 3 offrent une sélectivité suffisamment élevée, car parcourir un index plus grand sera plus coûteux que lire des clés supplémentaires.

Vous pouvez lire cet article dans mon blog:

+0

Index fonctionne comme par magie !! Merci .... mais juste curieux, y at-il d'autres moyens que nous pouvons utiliser pour rendre une telle requête plus rapide? – Bhaskar