2009-06-16 12 views
4

Nos sites sont très compliqués et nous examinons l'optimisation de certaines de nos requêtes existantes.Vitesse de requête de l'index clusterisé SQL Server 2005

Tout en regardant dans ce que nous avons rencontré plusieurs requêtes dont le plan d'exécution était d'environ 4-5 fois plus rapide quand une simple référence de l'index cluster est dans la requête ... par exemple

Si tel était l'ancienne requête :

SELECT ... 
FROM myTable 
WHERE categoryID = @category 

la requête suivante serait 4 fois plus rapide selon le plan d'exécution dans SSMS:

SELECT ... 
FROM myTable 
WHERE categoryID = @category 
AND lotID = lotID 

Nous ne pouvons pas sembler logique de la façon dont t Cela rendrait la requête plus rapide. L'index clusterisé est sur lotID mais puisque c'est faire une comparaison avec lui-même, comment cela aide-t-il?

Répondre

6

me semble assez évident pour

votre première requête ne sont pas couverts par l'index ordonné en clusters tandis que le second est depuis ID_lot n'est pas dans la clause WHERE de la première requête

Vous pouvez lire SQL Server covering indexes à voir comment tout cela fonctionne

vous devez également comprendre qu'un index clusterisé est les données, toutes les données d'une table sont dans l'index cluster. lorsque vous créez un index non cluster sur une table contenant un index cluster, l'index non clusterisé aura un pointeur vers l'index clusterisé (puisque c'est là que réside le reste des données), sauf si vous pouvez satisfaire complètement votre requête par le cluster non clusterisé index et dans ce cas, seul l'index non cluster sera utilisé ... Je vais arrêter maintenant décousu

EDIT

Je lis et ID_lot = @lotID PAS eT ID_lot = ID_lot

parfois vous pouvez Tromper un index cluster en faisant où lotID> 0 (choisir le plus petit nombre que vous avez) et vous obtiendrez une recherche

Donc, si votre petit ID_lot = 1 et vous ajoutez ET ID_lot> 0

vous pouvez aussi voir un cherchent au lieu d'une analyse, je démontrerai WHERE IndexValue> « » dans ce post Is an index seek always better or faster than an index scan?

+0

Ce ne serait le cas si toutes les colonnes de l'instruction SELECT étaient également dans l'index cluster. Je ne pense pas vraiment que c'est le cas ici (bien qu'il pourrait être) –

+1

permettez-moi de réitérer toutes les données pour une table (sans compter le débordement de ligne BLOB LOB et l'image + types varchar (max)) ARE dans l'index cluster – SQLMenace

+0

Est-ce une pratique générale d'utiliser un index cluster dans la clause WHERE même si cela n'affecte pas les résultats renvoyés mais accélère la requête? Je n'ai jamais vu ça. –