Le plan de mise en œuvre, également appelé package de requête ou package explicatif), est une étape spécifique de l'instruction SQL exécutant la base de données, telle que par des tables d'accès à la numérisation d'indexation ou de tableau complet, de déploiement de la requête de connexion et de la commande de connexion, etc. Si la performance de l'instruction SQL n'est pas idéale, nous devrions d'abord envisager son plan de mise en œuvre. Cet article décrit principalement comment recevoir et comprendre les plans de mise en œuvre dans différentes bases de données et fournir une analyse approfondie supplémentaire des références.
De nombreux outils de gestion et de développement fournissent des fonctions permettant d'afficher des packages d'exécution graphiques, tels que MySQL Workbench, Oracle SQL Developer, SQL Server Management Studio, DBeaver, V.V. Nous ne prévoyons pas d'utiliser ce type d'outil. Au lieu de cela, reportez-vous à la commande fournie par la base de données pour voir le plan exécutable.
Nous donnons d'abord un simple résumé du plan de mise en œuvre dans différentes bases de données:
1. Plan de mise en œuvre MySQL
La méthode pour obtenir une méthode selon MySQL est très simple, juste devant l'instruction SQL et expliquer les mots-clés :
EXPLAINSELECT e.first_name,e.last_name,e.salary,d.department_name FROM employees e JOIN departments d ON (e.department_id = d.department_id) WHERE e.salary > 15000;
L'exécution de cette instruction retournera le package de déploiement officiel comprenant 12 colonnes:
id|select_type|table|partitions|type |possible_keys |key |key_len|ref |rows|filtered|Extra |--|-----------|-----|----------|------|-----------------|-------|-------|--------------------|----|--------|-----------| 1|SIMPLE |e | |ALL |emp_department_ix| | | | 107| 33.33|Using where| 1|SIMPLE |d | |eq_ref|PRIMARY |PRIMARY|4 |hrdb.e.department_id| 1| 100| |
XPLAIN ANALYZESELECT e.first_name,e.last_name,e.salary,d.department_name FROM employees e JOIN departments d ON (e.department_id = d.department_id) WHERE e.salary > 15000;-> Nested loop inner join (cost=23.43 rows=36) (actual time=0.325..1.287 rows=3 loops=1) -> Filter: ((e.salary > 15000.00) and (e.department_id is not null)) (cost=10.95 rows=36) (actual time=0.281..1.194 rows=3 loops=1) -> Table scan on e (cost=10.95 rows=107) (actual time=0.266..0.716 rows=107 loops=1) -> Single-row index lookup on d using PRIMARY (department_id=e.department_id) (cost=0.25 rows=1) (actual time=0.013..0.015 rows=1 loops=3)
Expliquer dans le support de MySQL, sélectionnez, supprimer , insérer, remplacer et mettre à jour les instructions.
Ensuite, ce que nous devons faire est de comprendre le sens de ces domaines dans le plan de mise en œuvre. Le tableau suivant répertorie les rôles de chaque école dans le package exécutable MySQL:
Pour l'exemple ci-dessus, seule une clause Selece, ID est 1; Tout d'abord effectuer la totalité de l'ensemble de la balayage (type = Tout) sur la table des employés, gérer 107 flux de données et utilisation dans laquelle les conditions sont filtrées, 33,33% des données restantes sont attendues (les estimations sont incorrectes); Ensuite, utilisez la table de données en fonction de la touche DATA =) Trouvez un flux de donnéesComment (type = eq_ref, rangées = 1).Ajout de la même option d'analyse avec MySQL 8.0 pour afficher des informations supplémentaires en tant que temps de mise en oeuvre réel:
, où l'intérieur de la boucle indique que les deux tables sont reliées par une boucle imbriquée Les connexions et les employés sont la table d'entraînement. Le coût représente le prix estimé, les lignes montrent le nombre de biens retournés; Temps pratique Affiche le temps réel renvoie la première rangée et toutes les lignes de données, la ligne derrière le nombre de lignes est répétée par des boucles et des boucles représentant le nombre de cycles d'itérateur.
Plan d'exécution du lundi, Oracle
EXPLAIN PLAN FORSELECT e.first_name,e.last_name,e.salary,d.department_name FROM employees e JOIN departments d ON (e.department_id = d.department_id) WHERE e.salary > 15000;
De nombreuses façons de voir les packages d'exécution fournis à Oracle. Cet article utilise:
1. Utilisez le plan pour expliquer à la commande de créer et de sauvegarder le plan de mise en œuvre;
SELECT * FROM TABLE(DBMS_XPLAN.display);PLAN_TABLE_OUTPUT |--------------------------------------------------------------------------------------------|Plan hash value: 1343509718 | |--------------------------------------------------------------------------------------------|| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time ||--------------------------------------------------------------------------------------------|| 0 | SELECT STATEMENT | | 44 | 1672 | 6 (17)| 00:00:01 ||| 1 | MERGE JOIN | | 44 | 1672 | 6 (17)| 00:00:01 ||| 2 | TABLE ACCESS BY INDEX ROWID| DEPARTMENTS | 27 | 432 | 2 (0)| 00:00:01 ||| 3 | INDEX FULL SCAN | DEPT_ID_PK | 27 | | 1 (0)| 00:00:01 |||* 4 | SORT JOIN | | 44 | 968 | 4 (25)| 00:00:01 |||* 5 | TABLE ACCESS FULL | EMPLOYEES | 44 | 968 | 3 (0)| 00:00:01 ||--------------------------------------------------------------------------------------------| |Predicate Information (identified by operation id): |--------------------------------------------------- | | 4 - access("E"."DEPARTMENT_ID"="D"."DEPARTMENT_ID") | filter("E"."DEPARTMENT_ID"="D"."DEPARTMENT_ID") | 5 - filter("E"."SALARY">15000) |
2. Affichez le package de mise en œuvre enregistré. En premier, créez un emballage exécutable:
] Expliquez le plan de la commande de ne pas exécuter l'instruction SQL, le package d'exécution n'est donc créé pas nécessairement le même que le plan réel lors de la création de cette déclaration.
Cette commande enregistre le plan de mise en œuvre créé dans une table temporaire globale, puis en utilisant le processus est stocké dans le package système DBMS_XPLAN pour formater l'exécutable dans la table. L'instruction suivante peut voir le package d'exécution final de la session en cours:
Plan d'explication de Oracle pour prendre en charge les commandes de sélection, de mise à jour, d'insertion et de suppression.
Ensuite, nous devons également comprendre la signification d'informations différentes dans le plan de mise en œuvre:La valeur de hachage de paquets est la valeur hachage de cette déclaration. Les instructions et les exécutables SQL sont stockés dans un tampon de bibliothèque, la même instruction de la valeur de hachage peut réutiliser les packages d'exécution existants, l'analyse molle;
L'ID est des séries, mais cela ne signifie pas que l'ordre est effectué. L'ordre d'exécution est surmonté, plus les bosses, plus il exécute et agitTeinté de haut en bas. L'astérisque à l'avance représente le jugement prédictionnel, faisant référence aux termes suivants; Activités indiquant l'opération actuelle, ce qui signifie comment accéder aux données de la table, comment déployer la table, comment organiser des opérations, V.V.; Nom du nom, nom d'index ou requête enfant, accessible, la prémisse est l'activité actuelle liée à ces objets;
La ligne est la quantité de marchandises renvoyées par les estimations d'Oracle, également appelée cardinalité;L'octet est le volume des données estimé par Oracle
COÛT (% CPU) est un calcul Oracle pour mettre en œuvre les coûts nécessaires à cette activité;SET STATISTICS PROFILE ON
Le temps est nécessaire pour estimer Oracle pour effectuer des opérations; Prédicat affiche des informations d'information. L'accès est une condition d'accès, affectant les méthodes d'accès aux données (tables de balayage ou index); Les filtres sont des conditions de filtrage, après récupération de données, filtrant sous cette condition.
Dans l'exemple ci-dessus, l'ordre d'exécution de l'identifiant est de 3 - & GT;2 - & gt; 5 - & gt; 4- & gt; 1. D'abord, ID = 3 Scannez l'index de clé principale dept_id_pk, ID = 2 Appuyez sur la touche d'accès à clé principale, le résultat a été trié; Deuxièmement, ID = 5 Tables Scannez l'ensemble de l'accès des employés et utilisez les données du filtre de filtres, ID = 4 en fonction du nombre de pièces, de tri et de filtrage L'ID final = 1 rend la connexion unifiée. De toute évidence, cet oracle sélectionne la connexion des deux tables de manière triée.
SELECT e.first_name,e.last_name,e.salary,d.department_name FROM employees e JOIN departments d ON (e.department_id = d.department_id) WHERE e.salary > 15000;first_name|last_name|salary |department_name|----------|---------|--------|---------------|Steven |King |24000.00|Executive |Neena |Kochhar |17000.00|Executive |Lex |De Haan |17000.00|Executive |Rows|Executes|StmtText |StmtId|NodeId|Parent|PhysicalOp |LogicalOp |Argument |DefinedValues |EstimateRows|EstimateIO |EstimateCPU|AvgRowSize|TotalSubtreeCost|OutputList |Warnings|Type |Parallel|EstimateExecutions|----|--------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------|------|------|--------------------|--------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------|------------|------------|-----------|----------|----------------|----------------------------------------------------------------------|--------|--------|--------|------------------| 3| 1|SELECT e.first_name,e.last_name,e.salary,d.department_name¶ FROM employees e¶ JOIN departments d ON (e.department_id = d.department_id)¶ WHERE e.salary > 15000 | 1| 1| 0| | | | | 2.9719627| | | | 0.007803641| | |SELECT | 0| | 3| 1| |--Nested Loops(Inner Join, OUTER REFERENCES:([e].[department_id])) | 1| 2| 1|Nested Loops |Inner Join |OUTER REFERENCES:([e].[department_id]) | | 2.9719627| 0| 0| 57| 0.007803641|[e].[first_name], [e].[last_name], [e].[salary], [d].[department_name]| |PLAN_ROW| 0| 1| 3| 1| |--Clustered Index Scan(OBJECT:([hrdb].[dbo].[employees].[emp_emp_id_pk] AS [e]), WHERE:([hrdb].[dbo].[employees].[salary] as [e].[salary]>(15000.00))) | 1| 3| 2|Clustered Index Scan|Clustered Index Scan|OBJECT:([hrdb].[dbo].[employees].[emp_emp_id_pk] AS [e]), WHERE:([hrdb].[dbo].[employees].[salary] as [e].[salary]>(15000.00)) |[e].[first_name], [e].[last_name], [e].[salary], [e].[department_id]| 3|0.0038657407| 2.747E-4| 44| 0.004140441|[e].[first_name], [e].[last_name], [e].[salary], [e].[department_id] | |PLAN_ROW| 0| 1| 3| 3| |--Clustered Index Seek(OBJECT:([hrdb].[dbo].[departments].[dept_id_pk] AS [d]), SEEK:([d].[department_id]=[hrdb].[dbo].[employees].[department_id] as [e].[department_id]) ORDERED FORWARD)| 1| 4| 2|Clustered Index Seek|Clustered Index Seek|OBJECT:([hrdb].[dbo].[departments].[dept_id_pk] AS [d]), SEEK:([d].[department_id]=[hrdb].[dbo].[employees].[department_id] as [e].[department_id]) ORDERED FORWARD|[d].[department_name] | 1| 0.003125| 1.581E-4| 26| 0.0035993|[d].[department_name] | |PLAN_ROW| 0| 3|
Forfait d'exécution de troisième SQL, SQL Seacser
SQL Server Management Studio fournit un moyen simple de visualiser des packages d'exécution graphiques, nous introduisons ici Phuong Wake up la commande:
]La commande ci-dessus peut ouvrir la fonction d'analyse de l'instruction SQL Server et la commande exécutable après ouverture du plan d'exécution correspondant:
Le plan d'exécution dans SQL Server prend en charge la sélection, l'insertion de l'insertion,mettez à jour, supprimer et exécuter des commandes.
SQL Server exécute l'ordre d'exécution des différentes étapes pour déterminerH Selon la correction d'erreur, la plus grande indentation est effectuée et agit de haut en bas. Ensuite, nous devons comprendre la signification des différentes informations dans le déploiement:
La ligne indique le nombre d'enregistrements réels créés par cette étape;
L'exécution indique le nombre de fois que l'étape réelle est effectuée;
STMTTEXT contient des descriptions étape par étape, ce qui signifie comment accéder à des données et filtrer les données, comment connecter des tables, comment organiser des opérations, v.v.;
STMTID, le nombre de déclarations;
NodeID, le nombre de boutons de l'étape de fonctionnement en cours ne signifie pas la commande;
Destiny, le bouton Père de l'étape de fonctionnement en cours, premier exécutif Le sous-bouton, puis exécutez le nœud parent;
Arts martiaux, activités physiques, effectuer des boucles de connectivité imbriquées;
Opérations logiques et logiques, telles que les activités de connexion interne; arguments, paramètres sont utilisés;
Déterminer l'équilibre, la valeur de la variable détermine;
Estimation, estimation des biens retournés;
Estimation des coûts IO;
Estimer ChJe charge la CPU;
Avgrowser, taille moyenne;
TOTAALSUBTRECOST, COÛT DE NODE CURELLE;
Liste de sortie, listes de sortie de champ;
AVERTISSEMENT, Informations d'avertissement prévisibles;Type, type d'étape de fonctionnement actuel;
Parallèlement, qu'il soit parallèle;SET STATISTICS PROFILE OFF
ExpressCiaxecutions, cette étape devrait être exécutée; Pour la commande ci-dessus, l'ordre de commande 3 - & gt; 4 - & gt; 2 - & gt; 1. Premièrement, sur la troisième ligne, il renvoie 3 flux de données en balayant la table du personnel et les enregistrements des employés Plus, et le nombre de marchandises (3 084121673583984) est très proche; Ensuite, exécutez la quatrième ligne, boucle à l'aide de la table de table d'indexation générale, la boucle 3 fois par heure, une ligne de données; La deuxième ligne est leur nœud parent, indiquant la participation à l'intérieur, la colonne d'argument utilise le mode de boucle imbriquée (référence externe: ([par disteling_id]) Description de la table de lecteur pour les employés; la première ligneReprésentant toute la requête et n'effectue pas d'opérations réelles.
Enfin, la commande suivante peut être utilisée pour éteindre la fonction d'analyse de commande: Introduction aux plans d'exécution SQL Server et SQL Tuning, vous pouvez vous reporter au package Mettre en œuvre le document officiel de SQL Serveur.
Plans de mise en œuvre de mercredi, PostgreSQL
EXPLAINSELECT e.first_name,e.last_name,e.salary,d.department_name FROM employees e JOIN departments d ON (e.department_id = d.department_id) WHERE e.salary > 15000;QUERY PLAN |----------------------------------------------------------------------|Hash Join (cost=3.38..4.84 rows=3 width=29) | Hash Cond: (d.department_id = e.department_id) | -> Seq Scan on departments d (cost=0.00..1.27 rows=27 width=15) | -> Hash (cost=3.34..3.34 rows=3 width=22) | -> Seq Scan on employees e (cost=0.00..3.34 rows=3 width=22)| Filter: (salary > '15000'::numeric) |
La méthode contient un plan d'exécution dans PostgreSQL similaire à MySQL, qui est devant la déclaration SQL Plus avec l'explication du mot-clé:
PLATCHES À propos de la prise en charge OSTGRESQL pour la sélection, l'insertion, la mise à jour, la suppression, la mise à jour, la suppression, les valeurs, les exécutables, les déclarations, la création de tables comme et la création de mode de vision à motifs comme des phrases Diens.
L'ordre dans lequel postgrequery exécute le plan à déterminer en fonction de la correction, la plus grande indentation est effectuée et agit de haut en bas. Pour l'exemple ci-dessus, la première fois à analyser toute la METE (SEQ Scan), utilisez le salaire & GT; 15000 comme conditions de filtrage; Coût des coûts (0,00) deLa première ligne est renvoyée pour estimer et renvoie toutes les lignes (3.34); Les biens représentatifs pour les biens estimés sont estimés; La largeur représente la taille de la ligne retournée (unité d'octets). Ensuite, mettez ensuite les résultats de la numérisation dans la table de hachage de mémoire, deux coûts égaux à 3.34 car il est calculé par une heure après numérisée et stockée dans la table de hachage. Ensuite, numérisez des pièces et calculez la valeur de hachage selon Parts_ID, puis correspondez à la table de hachage précédente (d.department_id = e.department_id). La ligne la plus élevée indique que la base de données est en hausse de l'opération de fonctionnement de la connexion. L'explication dans PostgreSQL peut également utiliser l'option d'analyse pour afficher l'heure de fonctionnement réelle et plus d'informations sur la commande: Explication de l'analyse Il y a plus d'informations conformément à la déclaration exécutive. Parmi eux, le temps réel est un délai moyen (MS) tous les coûts réels répétitifs (MS), également divisés en temps de démarrage et temps completoignon; La boucle représente du temps répété; Le fonctionnement de hachage affiche également le nombre de godets, la quantité de lots (lot) et l'utilisation de la mémoire occupée, le plus grand lot de 1 signifie un stockage temporaire doit être utilisé; Le temps de planification est le moment de créer un plan de mise en œuvre; Le temps de mise en œuvre est la période réelle des déclarations, n'inclut pas la durée de planification. Plan d'exécution SQLite SQLITE fournit également une commande de plan de requête explicative pour obtenir des packages exécutables pour les instructions SQL: Explication dans la requête SQLITE Prend en charge Select, Insérer, mettre à jour, Supprimer et d'autres déclarations Les packages exécutables SQLite sont également répartis de la même manière et plus les dents sont exécutés et la même indentation de haut en bas. Le premier exemple scanne la table du personnel, puis trouve ensuite en permanence des données dans le département du ministère.sqlite ne prend en charge que le déploiement de la connexion,qui sont des boucles imbriquées. De plus, s'il vous plaît résoudreSQLITE simple peut également être utilisé pour afficher les chaînes de commande de la machine virtuelle pour exécuter la commande: À propos des informations relatives à la planification et à l'optimisation Exécution de SQLite, vous pouvez vous reporter à la documentation officielle SQLITE expliquant le plan de requête.