Plan d'exécution

Un article de Wikipédia, l'encyclopédie libre.

En informatique, et plus précisément dans le domaine des bases de données, un plan d'exécution est un schéma pas à pas des opérations d'accès aux données d'un système de gestion de base de données SQL.

Principe[modifier | modifier le code]

Plan d'exécution MySQL PhpMyAdmin d'un SELECT avec une jointure sur un wiki, sous forme d'un tableau en bas obtenu en cliquant sur "Expliquer SQL".

L'optimisation de requête consiste à étudier la meilleure manière d'exécuter une requête SQL. Comme les optimiseurs automatiques ne sont pas parfaits, les administrateurs de bases de données sont parfois amenés à examiner et préciser le plan d'exécution le plus rapide, par exemple en définissant l'algorithme de jointure à utiliser en tenant compte du volume des données manipulées. Les mots clés à inclure dans les requêtes SQL pour influencer le plan d'exécution sont appelés les hints (ou indicateurs).

Pour visualiser le rendu, certains SGBD permettent de représenter les plans d'exécution sous forme de texte ou de graphique[1]. En ligne de commande, il est possible d'utiliser l'instruction SQL EXPLAIN pour afficher le plan d'exécution, notamment sur un SELECT.

Exemple[modifier | modifier le code]

Voici une requête avec son plan d'exécution affiché par Microsoft SQL Server :

SELECT *
FROM HumanResources.Employee AS e
    INNER JOIN Person.Contact AS c
    ON e.ContactID = c.ContactID
ORDER BY c.LastName
StmtText
----
  |--Sort(ORDER BY:([c].[LastName] ASC))
       |--Nested Loops(Inner Join, OUTER REFERENCES:([e].[ContactID], [Expr1004]) WITH UNORDERED PREFETCH)
            |--Clustered Index Scan(OBJECT:([AdventureWorks].[HumanResources].[Employee].[PK_Employee_EmployeeID] AS [e]))
            |--Clustered Index Seek(OBJECT:([AdventureWorks].[Person].[Contact].[PK_Contact_ContactID] AS [c]),
               SEEK:([c].[ContactID]=[AdventureWorks].[HumanResources].[Employee].[ContactID] as [e].[ContactID]) ORDERED FORWARD)

On y voit que le moteur commence (en bas du plan d'exécution) par scanner la table Employee sur la clé primaire ContactID, puis recherche la correspondance avec la table Contact.

Le résultat est ensuite joint par l'algorithme Nested Loops, et classé par LastName.

Notes et références[modifier | modifier le code]

Voir aussi[modifier | modifier le code]