Perf explain plan

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Script SQL*Plus de diagnostic
Voir aussi Perf top sql by disk reads · Perf top sql by buffer gets · Perf performance snapshot

Perf explain plan affiche le plan d'exécution d'une requête préalablement analysée par EXPLAIN PLAN et stockée dans plan_table, sous forme d'arbre indenté reconstruit par une requête hiérarchique (CONNECT BY). C'est la méthode classique d'analyse de plan, encore valable, mais largement remplacée en pratique par le paquet DBMS_XPLAN depuis Oracle 10g.

Script

-- Affiche le plan d'exécution stocké dans plan_table sous forme d'arbre indenté,
-- pour le STATEMENT_ID fourni en variable de substitution.

SELECT
    LPAD(' ', 2 * level) || operation || ' ' || options || ' ' || object_name AS plan_step
FROM
    plan_table
WHERE
    statement_id = '&&statement_id'
START WITH
    id = 0
CONNECT BY
      PRIOR id           = parent_id
  AND statement_id = '&&statement_id'
ORDER SIBLINGS BY id
/

Le point de départ a été corrigé à id = 0 (racine du plan) plutôt que id = 1 — sur certains plans la racine porte l'identifiant 0, ce qui faisait disparaître la ligne de tête de l'arbre. ORDER SIBLINGS BY id garantit en plus que les branches d'un même niveau restent dans l'ordre d'exécution.

Alternative moderne

Depuis Oracle 10g, DBMS_XPLAN évite d'avoir à gérer soi-même plan_table et affiche en plus coûts, cardinalités et prédicats :

EXPLAIN PLAN SET STATEMENT_ID = 'mon_plan' FOR
  SELECT /* requête à analyser */ ... FROM ... WHERE ...;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(NULL, 'mon_plan', 'ALL'));

-- Pour le plan réellement utilisé par une requête déjà exécutée (plus fiable,
-- car il reflète les vraies valeurs de bind et le plan effectivement choisi) :
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));

Voir aussi