2009-06-17 4 views
5

J'ai un plan d'exécution pour une jointure assez complexe qui montre une recherche d'index effectuée sur une table avec la lecture "Nombre réel de lignes" ~ 70 000, alors qu'il n'y a en fait que 600 lignes environ dans le tableau (le nombre estimé de lignes n'est que de 127).Le plan d'exécution SQL affiche un "nombre réel de lignes" supérieur à la taille de la table

Notez que toutes les statistiques sont à jour et que les paramètres d'entrée de la requête sont exactement les mêmes que ceux qui ont été entrés lors de la compilation du proc.

Pourquoi le nombre réel de lignes est-il si élevé et que signifie réellement le nombre "nombre réel de lignes"? Ma seule théorie est qu'un nombre élevé de lignes est lié aux boucles imbriquées, et que cette recherche d'index est en cours d'exécution un certain nombre de fois - le "nombre réel de lignes" représente réellement le nombre total de lignes sur toutes les exécutions . Si tel est le cas, le nombre estimé de lignes signifie-t-il également le nombre total de lignes sur toutes les exécutions?

+1

Je crois que vos hypothèses sont correctes – Avitus

Répondre

9

ActualRows compte le nombre de fois GetNext() a été appelée sur un opérateur physique.

Vous devriez également regarder le ActualRebinds, ActualRewinds and ActualEndOfScans pour avoir une idée combien de fois la boucle interne a été réévalué:

A REBIND signifie qu'un ou plusieurs des paramètres corrélés de la jointure changé et le côté intérieur doit être réévalué. Un retour signifie qu'aucun des paramètres corrélés a changé et l'ensemble de résultats interne antérieur peut être réutilisé.

3

Le nombre réel de valeurs de lignes est le résultat de toutes les valeurs traitées pour ce nœud dans le plan d'exécution. donc oui il prend en compte les boucles imbriquées jointes.