Pourquoi les lectures logiques élevées pour les fonctions d'agrégation fenêtrées ?
Lors de l'utilisation de spools de sous-expressions courants dans les plans d'exécution, les lectures logiques ont tendance à être considérablement gonflées pour les grandes tables. Après avoir expérimenté et observé le plan d'exécution, il a été découvert que la formule suivante semble être vraie :
Lectures logiques de la table de travail = 1 NumberOfRows 2 NumberOfGroups 4
Cependant, la raison sous-jacente de cette formule reste floue. Cet article vise à percer le mystère derrière ce calcul de lecture logique.
Comprendre l'exécution de la fonction d'agrégat fenêtré
L'itérateur de segment au début du plan ajoute un indicateur aux lignes indiquant le début de chaque nouvelle partition. Le spool de segments principal récupère ensuite les lignes une par une et les insère dans une table de travail tempdb. Lorsqu'il rencontre le nouvel indicateur de groupe, le spool renvoie une ligne à l'entrée supérieure de l'opérateur de boucles imbriquées.
Cela déclenche l'agrégation du flux sur les lignes de la table de travail, calculant la moyenne. La moyenne calculée est ensuite jointe aux lignes de la table de travail, et la table de travail est tronquée en vue du groupe suivant. La bobine de segments génère une ligne factice pour traiter le groupe final.
Calcul de lecture logique pour les tables de travail
Selon notre compréhension, la table de travail est un tas (ou une bobine d'index si spécifié autrement dans le plan). Dans l'exemple fourni, contrairement aux attentes, seules 11 lectures logiques sont nécessaires. Une explication de cette différence est la suivante :
Cela porte le nombre total de lectures logiques à 4 x 3 = 12, en omettant l'insertion de la quatrième ligne qui déclenche une lecture logique seulement dans l'original scénario.
Conclusion
La clé pour comprendre cette formule réside dans l'écart entre le comptage de lectures logiques pour les tables de travail et les tables de spool classiques. Pour les tables de travail, chaque ligne lue est comptée comme une lecture logique, tandis que pour les tables de spool, chaque page hachée est comptée.
La formule s'aligne sur l'exécution observée : deux spools secondaires sont lus deux fois (2 COUNT ()), tandis que le spool principal émet (COUNT(DISTINCT CustomerID) 1) lignes comme expliqué dans l'entrée de blog mentionnée dans les informations supplémentaires. Le supplément est dû à la ligne supplémentaire émise pour indiquer la fin du groupe final.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!