# [Oracle] Laufzeit von Abfrage ausgeben



## Thomas Darimont (16. Oktober 2004)

Hallo!

Wenn ihr in Oracle SQLPLUS das Kommando
SET TIMING ON
eingebt wird nach jeder abgesetzten Abfrage die Dauer jener ausgegeben.

Bsp.:

```
SQL> set timing on;
SQL> select * from user_tables where TABLESPACE_NAME='SYSTEM';
... (Tausende Zeilen)
103 Zeilen ausgewõhlt.

Abgelaufen: 00:00:04.02
```

Das Ganze könnt ihr dann mit 
SET TIMING OFF
wieder ausschalten.

HTH
Gruß Tom


----------



## Exceptionfault (17. Oktober 2004)

Wenn wir gerade bei "Performance" Infos sind, hier ein Tipp um wirklich die Leistungsfähigkeit eines Statements zu ermitteln, der Explain Plan:

Der Explain Plan zeigt die Ausführungsschritte und deren Aufwand zur Ausführung eines Statements. Um Einen Explain Plan zu erzeugen ist eine Temporäre Tabelle namens PLAN_TABLE nötig. Oracle liefert das Script oracle\ora920\rdbms\admin\utlxpls.sql
zum erzeugen der Tabelle mit.
Vor dem Ausführen würde ich persönlich das Script noch etwas anpassen, so dass die Tabelle nicht im System Tablespace erzeugt wird, wenn die Tabelle als User SYS angelegt wird.

Wurde die Tabelle unter User SYS erzeugt sollte die Tabelle allen Benutzern der Datenbank zugänglich gemacht werden mittels:


```
CREATE OR REPLACE PUBLIC SYNONYM PLAN_TABLE FOR SYS.PLAN_TABLE;
GRANT SELECT, INSERT, UPDATE, DELETE ON SYS.PLAN_TABLE TO PUBLIC;
```

Jeder beliebige Benutzer kann nun seine Statements analysieren z.B als User Scott:


```
EXPLAIN PLAN FOR
   SELECT * FROM emp;
```

Mit einem anderen Script kann nun das Ergebnis schön dargestellt werden:
oracle\ora920\rdbms\admin\utlxpls.sql

Das Ergebnis sieht dann etwa so aus:

```
SQL> @C:\oracle\ora920\rdbms\admin\utlxpls.sql

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------

--------------------------------------------------------------------
| Id  | Operation            |  Name       | Rows  | Bytes | Cost  |
--------------------------------------------------------------------
|   0 | SELECT STATEMENT     |             |    14 |   518 |     2 |
|   1 |  TABLE ACCESS FULL   | EMP         |    14 |   518 |     2 |
--------------------------------------------------------------------

Note: cpu costing is off

9 Zeilen ausgewõhlt.
```

Man sieht, dass Oraclehier ein FULL TABLE SCAN macht.
Besser wäre ein Zugriff per Index auf einen speziell gewünschten Datensatz:


```
SQL> explain plan for select * from emp where empno = 210;

EXPLAIN PLAN ausgef³hrt.

SQL> @C:\oracle\ora920\rdbms\admin\utlxpls.sql

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------

--------------------------------------------------------------------------------
| Id  | Operation                   |  Name       | Rows  | Bytes | Cost (%CPU)|
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |             |     1 |    37 |     2  (50)|
|   1 |  TABLE ACCESS BY INDEX ROWID| EMP         |     1 |    37 |     2  (50)|
|*  2 |   INDEX UNIQUE SCAN         | PK_EMP      |    14 |       |     1   (0)|
--------------------------------------------------------------------------------

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

   2 - access("EMP"."EMPNO"=210)

13 Zeilen ausgewõhlt.
```


----------

