web-dev-qa-db-fra.com

Pourquoi un indice groupé voudrait-il renvoyer un "nombre réel réel de lignes" plus élevé que des lignes dans la table sous-jacente?

Je résout le problème d'un problème lié à SQL Server (Base de données Azure SQL Techniquement), en choisissant occasionnellement un mauvais plan d'exécution, probablement due à des statistiques asymétriques. sp_updatestats la corrige à chaque fois, jusqu'à quelques heures ou quelques jours plus tard, quand un mauvais plan est à nouveau mis en cache.

En regardant le plan "mauvais", j'ai remarqué quelque chose qui me frappe comme impair: il y a un indice en regroupement recherché sur une table qui compte actuellement environ 1,7 million de lignes. Le "nombre estimé de lignes" pour cette opération est d'environ 1200, ce qui est définitivement conforme au nombre moyen de lignes, je m'attendrais à cette opération dans ce cas, mais le "nombre réel de lignes" est supérieur à 60 millions! En suivant la gamme de graisse de ce nœud de feuille, diverses opérations en aval, telles que des jointures et des sortes, sont en cours de réalisation sur les 60 millions, provoquant une lenteur excessive, des déversements à TEMPDB et d'autres méchants.

Je dois être mal compris que la recherche d'un indice en regroupement fait réellement, car je ne penserais pas qu'il est possible de "produire" plus de lignes que dans la table sous-jacente. Qu'est-ce qui pourrait causer cela? Et mieux encore, tous les indicateurs sur la façon de le réparer?

[Points bonus pour inclure quelque chose comme "sp_updatestats la corrige à chaque fois mais ne peut pas comprendre comment la réparer de façon permanente? Allez lire cet article. "Cela a été un problème général pour nous sur quelques fronts différents ces derniers temps.]

6
Todd Menier

La recherche retourne plus de lignes car elle est sur le côté intérieur (inférieur) d'une boucle imbriquée. Chaque ligne renvoyée par l'opération extérieure entraîne une nouvelle opération de recherche. Donc, vous n'obtenez pas 60 millions de lignes d'une seule recherche, mais de plus de 9000 d'entre eux (nombre d'exécutions).

Aussi de note: lorsque vous recherchez des estimations, le nombre total de lignes estimées sera Nombre estimé d'exécutions multiplié par nombre estimé de lignes

6
Forrest