2010-10-20 2 views
1

J'ai une table avec colonne est traitée bit nul. J'ai créé un index (non groupé) sur cette colonne. Avant d'appliquer la requête d'indexTSQL-Quelle est la différence entre deux requêtes?

**`SELECT top 5000 * From Request Where IsProcessed Is Null`** 

a pris 30 à 40 secondes. Rappelez-vous ceci est une très grande table avec des rangées de plus de 10 millions. Maintenant, après avoir créé l'index sur la colonne isprocessed, la même requête n'a montré aucune amélioration des performances.

J'ai essayé une autre requête **

;With TopN As(SELECT Top 5000 * from Request Order By IsProcessed) 
SELECT * From TopN Where IsProcessed Is Null 

** Maintenant, ce suprizingley de requête donne une sortie en moins de 2 secondes Je me demande pourquoi est-il une différence de perforamnce dans deux requêtes. Quel est le comportement d'indexation sur les colonnes NULL bit

+1

Comme @Thomas noté, ces 2 requêtes ne renverront pas nécessairement le même nombre de lignes, ou même les mêmes lignes ... –

Répondre

1

Activez «Afficher le plan d'exécution réel» pour voir quels index sont utilisés dans chaque cas.

Si vous créez un index sur une colonne avec une faible sélectivité (comme un champ de bits), l'optimiseur ne l'utilisera probablement pas (cela dépend).

Si vous avez une colonne de bit 'IsProcessed' et que moins de 10% des lignes sont définies et si vous recherchez ces lignes, l'index peut être utilisé. Considérant que, si vous avez un index sur un champ à deux états tel que le genre ('M', 'F') avec des valeurs d'environ 50%/50%, il est hautement improbable que l'optimiseur utilise cet index.

0

La deuxième requête sélectionnera 500 d'abord, puis appliquer la clause where, où la première requête appliquera la clause where d'abord, puis le top 5000

Jetez un oeil à SQL SERVER – Logical Query Processing Phases – Order of Statement Execution

+0

droite mais dans la deuxième requête il y a une clause order by donc ça veut dire qu'elle va s'appliquer d'abord et ensuite sélectionner les 5000 premières lignes . L'ordre par colonne dans la deuxième requête est identique à celui où la colonne est dans la première requête. Donc, à mon avis, c'est l'indexation qui aide la deuxième requête à s'exécuter rapidement comme la colonne indexée est en ordre par clause. La question est pourquoi pas cette aide d'indexation si la colonne est dans la clause where. – ZafarYousafi