Quelqu'un peut-il expliquer un peu le plan d'explication et comment obtenir le plan d'explication d'une requête? De plus, s'il existe un script sql qui peut être utilisé comme utilitaire pour cela, ce serait bien.
Vous pouvez utiliser le package DBMS_XPLAN :
SQL> explain plan for select * from dual;
Explained
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 | 2 |
| 1 | TABLE ACCESS FULL | DUAL | 1 | 2 | 2 |
--------------------------------------------------------------------
Note: cpu costing is off
L'instruction EXPLAIN PLAN affiche les plans d'exécution choisis par l'optimiseur pour les instructions SELECT, UPDATE, INSERT et DELETE. Un plan d'exécution d'instruction est la séquence d'opérations que la base de données exécute pour exécuter l'instruction.
EXPLAIN PLAN FOR ...
Remplacez le ... par votre instruction SQL. Après avoir exécuté cela, exécutez ce qui suit pour afficher le plan:
SELECT * FROM table(dbms_xplan.display);
Pour plus d'informations, reportez-vous aux sections Overview ou sage du manuel Oracle 11g Performance Tuning Guide.
C'est une question très courante, j'ai donc décidé de transformer cette réponse en n article .
Le plan d'exécution estimé est généré par l'Optimiseur sans exécuter la requête SQL. Vous pouvez générer le plan d'exécution estimé à partir de n'importe quel client SQL à l'aide de EXPLAIN PLAN FOR ou vous pouvez utiliser Oracle SQL Developer pour cette tâche.
Lorsque vous utilisez Oracle, si vous ajoutez le EXPLAIN PLAN FOR
à une requête SQL donnée, la base de données stockera le plan d'exécution estimé dans le PLAN_TABLE
:
EXPLAIN PLAN FOR
SELECT p.id
FROM post p
WHERE EXISTS (
SELECT 1
FROM post_comment pc
WHERE
pc.post_id = p.id AND
pc.review = 'Bingo'
)
ORDER BY p.title
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY
Pour afficher le plan d'exécution estimé, vous devez utiliser DBMS_XPLAN.DISPLAY
, comme illustré dans l'exemple suivant:
SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY (FORMAT=>'ALL +OUTLINE'))
L'option de formatage ALL + OUTLINE vous permet d'obtenir plus de détails sur le plan d'exécution estimé que d'utiliser l'option de formatage par défaut.
Si vous avez installé SQL Developer, vous pouvez facilement obtenir le plan d'exécution estimé pour n'importe quelle requête SQL sans avoir à ajouter la commande EXPLAIN PLAN FOR:
Le plan d'exécution SQL réel est généré par l'Optimiseur lors de l'exécution de la requête SQL. Ainsi, contrairement au plan d'exécution estimé, vous devez exécuter la requête SQL afin d'obtenir son plan d'exécution réel.
Le plan réel ne devrait pas différer de manière significative de celui estimé, tant que les statistiques du tableau ont été correctement recueillies par la base de données relationnelle sous-jacente.
Pour demander à Oracle de stocker le plan d'exécution réel pour une requête SQL donnée, vous pouvez utiliser le GATHER_PLAN_STATISTICS
indice de requête:
SELECT /*+ GATHER_PLAN_STATISTICS */
p.id
FROM post p
WHERE EXISTS (
SELECT 1
FROM post_comment pc
WHERE
pc.post_id = p.id AND
pc.review = 'Bingo'
)
ORDER BY p.title
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY
Pour visualiser le plan d'exécution réel, vous pouvez utiliser DBMS_XPLAN.DISPLAY_CURSOR
:
SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS LAST ALL +OUTLINE'))
Si vous souhaitez obtenir les plans d'exécution pour toutes les requêtes générées au cours d'une session donnée, vous pouvez définir le STATISTICS_LEVEL
configuration de session à TOUS:
ALTER SESSION SET STATISTICS_LEVEL='ALL'
Cela aura le même effet que la définition de GATHER_PLAN_STATISTICS
indice de requête sur chaque requête d'exécution. Donc, tout comme avec le GATHER_PLAN_STATISTICS
indice de requête, vous pouvez utiliser DBMS_XPLAN.DISPLAY_CURSOR
pour afficher le plan d'exécution réel.
Vous devez réinitialiser le
STATISTICS_LEVEL
définition du mode par défaut une fois que vous avez terminé de collecter les plans d'exécution qui vous intéressaient. Ceci est très important, surtout si vous utilisez le regroupement de connexions et que les connexions à la base de données sont réutilisées.ALTER SESSION SET STATISTICS_LEVEL='TYPICAL'