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:
Code:
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:
Code:
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:
Code:
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:
Code:
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.