web-dev-qa-db-fra.com

Comment obtenez-vous le plan d'explication?

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.

10
user419534

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
9
Vincent Malgrat

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.

5
Leigh Riffel

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

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:

enter image description here

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 recueillies 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 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'))

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 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'
1
Vlad Mihalcea