Comment lire le coût de la requête et s'agit-il toujours d'un pourcentage?

34

J'étudie actuellement pour le test de certification Microsoft 70-433 (SQL 70-433) et je suis très confus quant à la mesure de la performance "coût de la requête".

Selon la documentation que j'ai pu trouver via Google, le coût de la requête est un pourcentage et représente le pourcentage du lot entier absorbé par une partie quelconque de celui-ci. Cela me semblait déjà un peu étrange, car je m'intéresse au mérite absolu d'une requête particulière plutôt qu'à son mérite par rapport à d'autres requêtes qui apparaissent à côté de celle-ci.

Mais ensuite, j'ai pensé, bon, peut-être que ce que vous êtes censé faire est de placer deux requêtes alternatives côte à côte, de les exécuter comme "un lot", puis celle qui a un coût inférieur à 50% est gagnante.

Mais la discussion sur le coût de la requête dans le chapitre 6, leçon 1 du kit de formation SQL 70-433 de Microsoft, ne semble pas avoir de lien avec cela.

Voici un exemple: Ils affichent une requête contenant deux sous-requêtes corrélées, puis l’améliorent en remplaçant les sous-requêtes par un OUTER APPLY. Le résultat: "Cette requête a un coût d'environ 76 $, alors que le coût de la première requête était le double, environ 151." Ils améliorent ensuite la requête encore davantage et réduisent le coût de 76 à 3,6. Ils n'impliquent pas que ces chiffres sont des pourcentages, alors qu'ils impliquent qu'il s'agit de chiffres absolus qui se rapportent à la requête en tant qu'objet autonome, sans référence à aucune autre requête. Et de toute façon, comment la première requête pourrait-elle coûter 151%?

Plus loin dans le chapitre, ils présentent une capture d'écran d'un plan d'exécution en trois parties. Le premier indique "Coût: 0%", le second indique "Coût: 1%" et le dernier indique "Coût: 99%", mais le texte (du livre lui-même) sous la capture d'écran "Le coût de cette requête est de 0,56" . Je suppose qu'ils signifient un autre type de coût, mais je ne trouve aucune référence à cela ailleurs.

Quelqu'un peut aider? Je suis complètement confus.


la source
PS En supposant qu'ils se réfèrent à autre chose qu'aux pourcentages indiqués dans les plans d'exécution ... comment faire en sorte que SSMS me montre les chiffres qu'ils citent? Ai-je besoin de quelque chose comme SET STATISTICS TIME ON, mais avec une autre commande qui me montrera un chiffre "coût" dans l'onglet Messages?

Réponses:

43

Le coût de la requête est indiqué dans les plans d'exécution en tant que "coût estimé de la sous-arborescence". C'est un chiffre absolu tel que 1.5. Conor Cunningham a mentionné dans une présentation SQLBits qu'il faisait référence au nombre de secondes nécessaires à l'exécution sur la machine d'un employé de Microsoft ( "Nick's Machine" ) dans SQL Server 7 jours

entrez la description de l'image ici

mais maintenant, devrait être interprété comme une mesure sans unité du coût global.

Le plan d'exécution est un arbre. Chaque itérateur de l'arborescence se voit attribuer un coût de processeur et d'estimation d'E / S estimés, qui sont ensuite combinés pour obtenir le coût global (la pondération relative peut être ajustée à l'aide de deux commandes DBCC non documentées ). Le coût estimé de la sous-arborescence comprend le coût de l'itérateur lui-même et de tous ses descendants. Pour voir un exemple des formules de calcul utilisées, consultez cet article .

Pour déterminer le coût estimé d'une requête entière dans SSMS, sélectionnez l'itérateur racine (par exemple, l' SELECTitérateur) situé à gauche du plan graphique et examinez cette mesure dans la fenêtre de propriétés de SSMS.

Lors de l'exécution de plusieurs requêtes (dans le même lot ou non), le pourcentage est calculé en additionnant toutes ces valeurs et en calculant le pourcentage comme prévu.

Vous devez savoir que même dans les plans d'exécution réels, ce coût est basé sur des estimations. Son utilisation pour comparer les mérites relatifs de deux requêtes différentes peut être terriblement erronée dans les cas où les estimations sont inexactes.

Martin Smith
la source
Merci, c'est vraiment utile. Et pas du tout évident! Je me demande pourquoi ce chiffre n'est pas signalé plus clairement?
4
Je me suis toujours interrogé sur l'unité de mesure, heureux de le découvrir enfin. J'ai expliqué aux gens (d'une manière comique) qu'il s'agissait de "dollars SQL". Si le coût d'une requête est égal à 1,0, cela revient à payer 1 dollar pour une tasse de café. Pas un mauvais prix. Souhaitez-vous payer 300 $ pour une tasse? En aucune façon!
datagod