Comment obtenez-vous le plan d'explication?

10

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 formidable.

user419534
la source
1
"s'il existe un script sql qui peut être utilisé comme utilitaire pour cela" quel type d'utilitaire recherchez-vous?
Derek Downey
2
De nombreux outils de développement SQL disposent d'interfaces graphiques très faciles à utiliser pour obtenir des plans d'exécution. Oracle SQL Developer en a un. Avez-vous accès à de tels outils ou souhaitez-vous spécifiquement le faire à partir de scripts?
FrustratedWithFormsDesigner
J'ai Oracle SQL Developer mais j'aimerais connaître les scripts.
user419534
2
Si vous avez suivi un cours avec Jonathan Lewis , vous saurez qu'il existe quelque chose comme 8 façons différentes d'obtenir un plan d'exécution d'Oracle. Veuillez noter ce commentaire si vous voulez que j'ajoute une réponse répertoriant toutes les différentes méthodes.
Colin 't Hart

Réponses:

9

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
Vincent Malgrat
la source
5

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 Usage du manuel Oracle 11g Performance Tuning Guide.

Leigh Riffel
la source
1

C'est une question très courante, j'ai donc décidé de transformer cette réponse en article .

Le plan d'exécution SQL estimé

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 d' EXPLAIN PLAN FOR ou vous pouvez utiliser Oracle SQL Developer pour cette tâche.

EXPLIQUER LE PLAN POUR

Lorsque vous utilisez Oracle, si vous ajoutez la EXPLAIN PLAN FORcommande à une requête SQL donnée, la base de données stockera le plan d'exécution estimé dans le dossier associé 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.

Développeur Oracle SQL

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:

entrez la description de l'image ici

Le plan d'exécution SQL réel

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 collectées par la base de données relationnelle sous-jacente.

Indice de requête GATHER_PLAN_STATISTICS

Pour demander à Oracle de stocker le plan d'exécution réel pour une requête SQL donnée, vous pouvez utiliser l' GATHER_PLAN_STATISTICSindicateur 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'))

Activer les STATISTIQUES au niveau de la connexion DB

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 la STATISTICS_LEVELconfiguration de la session sur TOUS:

ALTER SESSION SET STATISTICS_LEVEL='ALL'

Cela aura le même effet que la définition de l' GATHER_PLAN_STATISTICSindicateur de requête sur chaque requête d'exécution. Ainsi, tout comme avec l' GATHER_PLAN_STATISTICSindicateur de requête, vous pouvez utiliser DBMS_XPLAN.DISPLAY_CURSORpour afficher le plan d'exécution réel.

Vous devez réinitialiser le STATISTICS_LEVELparamètre au 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 pool de connexions et que les connexions à la base de données sont réutilisées.

ALTER SESSION SET STATISTICS_LEVEL='TYPICAL'
Vlad Mihalcea
la source