A lekérdezések végrehajtási tervét az Oracle egy PLAN_TABLE nevű táblába vagy egy ezzel azonos szerkezetű táblába teszi, ha erre megkérjük. Egy hosszú futási idejű lekérdezés esetén mindig érdemes megvizsgálni a végrehajtási tervet, megnézni az abban szereplő műveleteket és azok költségeit. Mindezt az alábbi 3 lépéssel tehetjük meg. 1. PLAN_TABLE létrehozása -> egy CREATE TABLE utasítás futtatása (az utasítást lásd lejjebb, általában a szerveren az utlxplan.sql nevű állományban van) 2. Végrehajtási terv létrehozása a PLAN_TABLE nevű táblába: (Szükséges, hogy legyen olyan nevű táblánk, amit a SELECT lekérdez.) EXPLAIN PLAN SET statement_id='ut1' -- 'ut1' -> az utasítás egyedi neve FOR SELECT dname, job, AVG(sal) FROM nikovits.emp NATURAL JOIN nikovits.dept WHERE hiredate > to_date('1981.01.01', 'yyyy.mm.dd') GROUP BY dname, job HAVING SUM(sal) > 5000 ORDER BY AVG(sal) DESC; 3. Majd a végrehajtási terv fa struktúrájának kiíratása egy hierarchikus (rekurzív) lekérdezéssel: SELECT LPAD(' ', 2*(level-1))||operation||' + '||options||' + ' ||object_owner||nvl2(object_owner,'.','')||object_name xplan FROM plan_table START WITH id = 0 AND statement_id = 'ut1' -- 'ut1' -> az utasítás neve szerepel itt CONNECT BY PRIOR id = parent_id AND statement_id = 'ut1' -- 'ut1' -> meg itt ORDER SIBLINGS BY position; A fenti lekérdezés csak a végrehajtási terv szerkezetét íratja ki, vagyis azt, hogy a fa csomópontjaiban milyen művelet hajtódik végre. A csomópontokra vonatkozóan azonban a PLAN_TABLE sok más hasznos információt is tartalmaz, ezeket is érdemes kiíratni. SELECT LPAD(' ', 2*(level-1))||operation||' + '||options||' + ' ||object_owner||nvl2(object_owner,'.','')||object_name xplan, cost, cardinality, bytes, io_cost, cpu_cost FROM plan_table START WITH ID = 0 AND STATEMENT_ID = 'ut1' -- az utasítás neve szerepel itt CONNECT BY PRIOR id = parent_id AND statement_id = 'ut1' -- meg itt ORDER SIBLINGS BY position; Vagy egy package (dbms_xplan) segítségével is kiírathatjuk a végrehajtási tervet: select plan_table_output from table(dbms_xplan.display('plan_table','ut1','all')); paraméterek: tábla_név, statement_id, részletesség (basic, typical, all, serial) ------------------------ utlxplan.sql tartalma: create table PLAN_TABLE ( statement_id varchar2(30), plan_id number, timestamp date, remarks varchar2(4000), operation varchar2(30), options varchar2(255), object_node varchar2(128), object_owner varchar2(30), object_name varchar2(30), object_alias varchar2(65), object_instance numeric, object_type varchar2(30), optimizer varchar2(255), search_columns number, id numeric, parent_id numeric, depth numeric, position numeric, cost numeric, cardinality numeric, bytes numeric, other_tag varchar2(255), partition_start varchar2(255), partition_stop varchar2(255), partition_id numeric, other long, distribution varchar2(30), cpu_cost numeric, io_cost numeric, temp_space numeric, access_predicates varchar2(4000), filter_predicates varchar2(4000), projection varchar2(4000), time numeric, qblock_name varchar2(30), other_xml clob );