Wenn man sich den Ausführungsplan eines Statements anschaut dann kann mein drei Bereiche sehen. Dazu bearbeiten wir folgendes Beispiel, wo der Ausfürungsplan mit SET autotrace on angzeigt wird.

Verweise

Schauen wir uns folgendes Beispiel an. Wie können die einzelnen Bereich erkennen und die Informationen interpretieren.

Das Folgende Statement wird mit SET autotrace ON ausgeführt.

SQL> SET autotrace ON
SQL> SELECT
  2      d.department_name Department_Name, l.city City, c.country_name Country
  3  FROM departments d INNER JOIN locations l ON  d.location_id = l.location_id
  4      INNER JOIN countries c ON c.country_id = l.country_id
  5  WHERE c.country_name = 'Germany';

DEPARTMENT_NAME                CITY                           COUNTRY
------------------------------ ------------------------------ ----------------------------------------
Public Relations               Munich                         Germany


Ausf³hrungsplan
----------------------------------------------------------
Plan hash value: 3851523148

-----------------------------------------------------------------------------------------------------------
| Id  | Operation                              | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                       |                  |     2 |    84 |     3   (0)| 00:00:01 |
|   1 |  NESTED LOOPS                          |                  |     2 |    84 |     3   (0)| 00:00:01 |
|   2 |   NESTED LOOPS                         |                  |     8 |    84 |     3   (0)| 00:00:01 |
|   3 |    NESTED LOOPS                        |                  |     2 |    54 |     2   (0)| 00:00:01 |
|*  4 |     INDEX FULL SCAN                    | COUNTRY_C_ID_PK  |     1 |    12 |     1   (0)| 00:00:01 |
|   5 |     TABLE ACCESS BY INDEX ROWID BATCHED| LOCATIONS        |     2 |    30 |     1   (0)| 00:00:01 |
|*  6 |      INDEX RANGE SCAN                  | LOC_COUNTRY_IX   |     2 |       |     0   (0)| 00:00:01 |
|*  7 |    INDEX RANGE SCAN                    | DEPT_LOCATION_IX |     4 |       |     0   (0)| 00:00:01 |
|   8 |   TABLE ACCESS BY INDEX ROWID          | DEPARTMENTS      |     1 |    15 |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - filter("C"."COUNTRY_NAME"='Germany')
   6 - access("C"."COUNTRY_ID"="L"."COUNTRY_ID")
   7 - access("D"."LOCATION_ID"="L"."LOCATION_ID")

Note
-----
   - this is an adaptive plan


Statistiken
----------------------------------------------------------
          4  recursive calls
          0  db block gets
         11  consistent gets
          0  physical reads
          0  redo size
        720  bytes sent via SQL*Net to client
        608  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL>

Fangen wir an und schauen uns die einzelnen Bereiche des Ausführungsplan an.

Als erstes sehen Sie die Ergebnismenge. Diese Anzeige können Sie ausblenden, wenn Sie die OPtion SET autotrace traceonly verwenden.

DEPARTMENT_NAME                CITY                           COUNTRY
------------------------------ ------------------------------ ----------------------------------------
Public Relations               Munich                         Germany

Darunter sehen Sie den eigentlichen Ausführungsplan. 

gesamter Ausführungsplan
Ausführungsplan
----------------------------------------------------------
Plan hash value: 3851523148

-----------------------------------------------------------------------------------------------------------
| Id  | Operation                              | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                       |                  |     2 |    84 |     3   (0)| 00:00:01 |
|   1 |  NESTED LOOPS                          |                  |     2 |    84 |     3   (0)| 00:00:01 |
|   2 |   NESTED LOOPS                         |                  |     8 |    84 |     3   (0)| 00:00:01 |
|   3 |    NESTED LOOPS                        |                  |     2 |    54 |     2   (0)| 00:00:01 |
|*  4 |     INDEX FULL SCAN                    | COUNTRY_C_ID_PK  |     1 |    12 |     1   (0)| 00:00:01 |
|   5 |     TABLE ACCESS BY INDEX ROWID BATCHED| LOCATIONS        |     2 |    30 |     1   (0)| 00:00:01 |
|*  6 |      INDEX RANGE SCAN                  | LOC_COUNTRY_IX   |     2 |       |     0   (0)| 00:00:01 |
|*  7 |    INDEX RANGE SCAN                    | DEPT_LOCATION_IX |     4 |       |     0   (0)| 00:00:01 |
|   8 |   TABLE ACCESS BY INDEX ROWID          | DEPARTMENTS      |     1 |    15 |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - filter("C"."COUNTRY_NAME"='Germany')
   6 - access("C"."COUNTRY_ID"="L"."COUNTRY_ID")
   7 - access("D"."LOCATION_ID"="L"."LOCATION_ID")

Note
-----
   - this is an adaptive plan

Man kann gut erkennen dasin Zeile 3 ein Plan hash value steht. Wenn zwei Pläne identisch sind, dann haben Sie den gleichen Plan hash value. Das hat eine Bedutung bei parsen des Statements, wenn das Statements bereits einmal geparst wurde, dann esteht der Plan bereits und man muss ihn nicht noch einmal erstellen. Ob der Plan bereits existiert wird über den Plan hash value geprüft. Es wird also über das gesamte Statement ein Hashwert gebildet.

Ausführungsplan
----------------------------------------------------------
Plan hash value: 3851523148

In der Zeile 6 – 17 sind die einzelnen Schritte des Plans aufgeführt. Wobei der oberste Schritt imer eine Id 0 hat und eine Zusammenfassung der Schritte 1 bis 8 ist. Die Id geben nicht die Reihenfolge der Abarbeitung an, diese Reihenfolge erkennt man, wenn man in der Spalte Operation den am meisten eingerückten Eintrag findet. in diesen Fall ist der Index Range Scan in der Zeile 6 des Plan der erste Schritt, welcher als erster ausgeführt wird.

-----------------------------------------------------------------------------------------------------------
| Id  | Operation                              | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                       |                  |     2 |    84 |     3   (0)| 00:00:01 |
|   1 |  NESTED LOOPS                          |                  |     2 |    84 |     3   (0)| 00:00:01 |
|   2 |   NESTED LOOPS                         |                  |     8 |    84 |     3   (0)| 00:00:01 |
|   3 |    NESTED LOOPS                        |                  |     2 |    54 |     2   (0)| 00:00:01 |
|*  4 |     INDEX FULL SCAN                    | COUNTRY_C_ID_PK  |     1 |    12 |     1   (0)| 00:00:01 |
|   5 |     TABLE ACCESS BY INDEX ROWID BATCHED| LOCATIONS        |     2 |    30 |     1   (0)| 00:00:01 |
|*  6 |      INDEX RANGE SCAN                  | LOC_COUNTRY_IX   |     2 |       |     0   (0)| 00:00:01 |
|*  7 |    INDEX RANGE SCAN                    | DEPT_LOCATION_IX |     4 |       |     0   (0)| 00:00:01 |
|   8 |   TABLE ACCESS BY INDEX ROWID          | DEPARTMENTS      |     1 |    15 |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------------------

In der Spalte Name findet an den Namen des Segments z.B. der Tabellenname LOCATIONS bzw. des Indexes LOC_COUNTRY_IX. Man Kann also in den Spalten des Plans folgende Eigenschaften erkennen.

Die Id gibt die Position im Ausführungsplan an. Der Schritt mit der ID 0 ist der letzte zusammenfassende Schritt. Der erste Schritt im Ausführungsplan ist der Schritt mit der ID 6, weil am meisten eingerückt ist. 

 

Die Spalte Operation gibt die Art des Schrittes an z.B. INDEX FULL SCAN  bedeutet das der gesamte Index gelesen wird. Während beim INDEX RANGE SAN nur Teile des Index gelesen werden.

Der Name des Index oder der Tabelle 

Wie viele Zeilen von der bei diesen Schritten enstehen bzw. verarbeitet werden. Im Schritt 2 werden 8 Zeilen verarbeitet. Am Ende des Querys (Schritt 0) werden also 2 Zeilen ausgegeben.

Wie viel Bytes für den Schritt in der PGA notwendig sind.

virtueller Kostenfaktor ohne Einheit der aus sich zwei Komponenten zusammen setzt. CPU-Kosten und I/O-Kosten.

Dauer des Scriittes im Sekunden