Terug naar de beginpaginaCentor Homepage

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(*)
_____ _

00
000016838

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.