|
Tips
& Trucs
EXPLAIN
PLAN zonder opstarten van query
Het komt
wel eens voor dat je wilt weten welke weg Oracle bewandelt
wanneer een bepaalde zoekopdracht wordt gegeven zonder dat
de query daarvoor wordt gestart. Het kan zijn dat zo'n zoektocht
van lange duur is en het handmatig instellen van de query
kost veel tijd. Maar voor dit soort gevallen is er een oplossing.
Wanneer u gebruikmaakt van het commando SET AUTOTRACE TRACEONLY
EXPLAIN, kunt u een EXPLAIN PLAN opvragen zonder dat de query
wordt geactiveerd. Dit commando moet worden ingevoerd via
de SQL Prompt. Door het bestand utlxplan.sql op te starten
is het mogelijk een tabel van het explain plan in het schema
te implementeren. Hieronder staat beschreven hoe u dit moet
doen in Oracle 7, 8 en 9.
Als voorbeeld
maakt u een tabel T aan in uw schema. Vervolgens voert u de
gewenste query uit op deze tabel:
SQL> Create
table T as select * from all_objects;
00Table Created
SQL>select
count(*) from t;
COUNT(*)
_____ _
00000016838
Het volgende
checkt of er indexes aanwezig zijn in tabel T:
SQL>select
index_name
02
from user_indexes
03
where table_name='T';
no
rows selected
Er zijn
dus geen indexes aanwezig. Stelt u zich eens voor dat we willen
weten hoe de volgende query zal verlopen:
select *
from t where owner='T'
Bij de SQL
Prompt, start:
SQL> @$ORACLE_HOME/rdbms/admin/utlxplan.sql
Vervolgens
wordt de PLAN_TABLE aangemaakt in het schema waarop de gebruiker
is aangemeld. Daarna doet u het volgende:
SQL>ALTER
SESSION SET SQL_TRACE =TRUE;
SQL> SET AUTOTRACE TRACEONLY EXPLAIN;
SQL>
select * from t
02
where owner='ADHOC';
Execution Plan
_____________________________________________
____
00
00000SELECT
STATEMENT
0Optimizer=CHOOSE
01
00
0TABLE
ACCESS (FULL) OF 'T'
Wanneer
we nu een index aanmaken in de gebruikerskolom van tabel T
en dezelfde query starten, gebeurt dit:
SQL> create
index owner_idx on t(owner);
Index created.
SQL> select
* from t
02
where owner='ADHOC';
Execution
Plan
_____________________________________________
___________
00
00000SELECT
STATEMENT
Optimizer=CHOOSE
01
00
0TABLE
ACCESS (BY INDEX ROWID) OF 'T'
02
01
0INDEX
(RANGE SCAN)
OF 'OWNER_IDX' (NON-UNIQUE)
___________
Zoals
u ziet levert dit de route op die Oracle doorloopt om dezelfde
veranderingen in de query door te voeren. En dit bereiken
we zonder de query op te starten!
Omdat
tips uit diverse bronnen afkomstig zijn, kan Het Orakel geen
verantwoordelijkheid nemen voor de juistheid van elke tip.
Gebruik ervan is dus op eigen risico. Het is derhalve verstandig
een tip die u wilt gebruiken uit te testen; bij voorkeur in
een non-productie omgeving.

|