web-dev-qa-db-fra.com

Comment lire le coût de la requête et est-ce toujours un pourcentage?

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

Selon toute 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 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 se trouvent à côté d'elle.

Mais alors, je me suis dit, eh bien, peut-être que ce que vous êtes censé faire est de placer deux requêtes alternatives côte à côte, de les exécuter en tant que "lot", puis celui qui a un coût inférieur à 50% est le gagnant.

Mais la discussion sur le coût des requêtes dans le chapitre 6, leçon un du kit de formation SQL 70-433 de Microsoft ne semble pas avoir de relation 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 une application externe. Le résultat: "Cette requête a un coût d'environ 76, tandis que le coût de la première requête était le double, environ 151." Ils améliorent ensuite encore la requête 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 à d'autres requêtes. Et de toute façon, comment la première requête pourrait-elle avoir un coût de 151%?

Plus loin dans le chapitre, ils montrent une capture d'écran d'un plan d'exécution en trois parties. Le premier dit "Coût: 0%", le second dit "Coût: 1%" et le dernier dit "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 peux pas y faire référence ailleurs.

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

34

Le coût de la requête est signalé dans les plans d'exécution en tant que "coût estimé des sous-arbres". Il s'agit d'un chiffre absolu tel que 1.5. Conor Cunningham a mentionné dans un présentation SQLBits qu'il se référait à l'origine au nombre de secondes nécessaires pour s'exécuter sur la machine d'un employé Microsoft particulier ( "Nick's Machine" ) dans SQL Server 7 journées

enter image description here

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 CPU estimé et un coût IO coût estimé et ceux-ci sont additionnés pour obtenir le coût global (les pondérations relatives peuvent être ajustées avec un couple de commandes DBCC non documentées ). Le coût estimé de la sous-arborescence inclut le coût de l'itérateur lui-même et de tous ses descendants. Pour voir un exemple des formules de calcul des coûts utilisées, vous pouvez consulter cet article .

Pour déterminer le coût estimé pour une requête entière dans SSMS, sélectionnez l'itérateur racine (par exemple, l'itérateur SELECT) à gauche du plan graphique et regardez cette métrique dans la fenêtre des propriétés SSMS.

Lorsque vous exécutez 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 vous vous y attendez.

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

43
Martin Smith