Bevezetés a költség alapú tervválasztásba I.
Feladatok végrehajtási tervek előállítására
(PLAN_TABLE)    
_______________________________________________________________ 
Segédanyagok:
>> Oracle Doc. - Performance Tuning Guide HTML   PDF  és itt 13-19. fejezetek,
      lásd 19. fejezet Végrehajtási tervek:  19. Using EXPLAIN PLAN  [ex_plan.htm]
>> Nikovits Tibor:  tervek1.txt  és tervek2.txt
_______________________________________________________________
A zh és beküldendő feladatoknál egy szöveges állományba bemásolva beküldendő: 
   1.) SELECT  /*+ tipp lista */ ...  vagyis a lekérdezés (hintekkel együtt),
   2.) lekérdezés outputja (ha az eredménytábla nagy, akkor annak az első 5 sora),
   3.) végrehajtási tervek fastruktúrájának szöveges megjelenítése (lásd köv.részt)

Előkészítés:
   - A gyakorlatokon az oradb adatbázisban az sqldeveloper-rel dolgozunk, ahol
     a SELECT-teket az Execute Statement (F9) hajtjuk végre és az eredményt
     a Result ablakban látjuk, a végrehajtási terveket az Execute Explain Plan (F6)
     segítségével készítjük el, annak eredményét pedig az Explain ablakban találjuk.

   - Mivel a Result és az  Explain ablakok eredményét nem tudjuk zh-ban beküldeni,
     ezért a zh-n Run Script (F5)-tel futtassuk a SELECT utasítást és az eredményt
     a Script Output-ból másoljuk át a beadandó egyszerű szöveges .txt állományba.
   - A végrehajtási tervek fastruktúrájának szöveges megjelenítéséhez (a beküldéshez)
     hozzuk létre a PLAN_TABLE nevű táblát az utlxplan.sql scriptnek a futtatásával.

A.) Végrehajtási tervek előállítása és kiíratása hierarchikus kérdés segítségével
   
   - 1.lépés: Készítsük el az utasítások végrehajtási tervét a a PLAN_TABLE táblába:

EXPLAIN PLAN SET statement_id='utasitas_egyedi_neve' INTO plan_table

FOR SELECT ...  
 
   - 2.lépés: Ezután vegyük is ki a terveket a táblából a megfelelő lekérdezéssel  
     Emlékeztetőül a hierarchikus szerkezetű adatok lekérdezése SELECT
     utasítás segítségével: a hierarchia gyökerét (gyökereit) a START WITH-el, 
     a szülő és gyermek sorok közti kapcsolatot a CONNECT BY-al kell megadni,

SET PAGESIZE 40
SET LINESIZE 132
COLUMN terv FORMAT A50
COLUMN feltetel FORMAT A80 TRUNCATED
COLUMN "feltetel (access--filter)" FORMAT A80 TRUNCATED

SELECT LPAD(' ', 2*(level-1))||operation||' + '||options||' + '||object_name terv,
access_predicates||' -- '||filter_predicates "feltetel (access--filter)"
FROM plan_table
START WITH id = 0 AND statement_id = 
'utasitas_egyedi_neve'
CONNECT BY PRIOR id = parent_id AND statement_id = 
'utasitas_egyedi_neve'
ORDER SIBLINGS BY position;

 
   - Figyeljünk oda, hogy a végrehajtási tervek előállításánál a fenti EXPLAIN PLAN parancsban
       EXPLAIN PLAN SET statement_id='utasitas_egyedi_neve' INTO plan_table
       FOR SELECT ...  
      az 'utasitas_egyedi_neve'-k helyére minden feladatnál új statement_id-t  adjunk meg,
      és ugyanezt az egyedi nevet haszáljuk a tervek megjelenítésénél  (kétszer is begépelve)
       SELECT... 
FROM plan_table
       START WITH ... statement_id = 
'utasitas_egyedi_neve'
       CONNECT BY PRIOR ... statement_id = 
'utasitas_egyedi_neve'...
 
B.) Végrehajtási tervek előállítása és kiíratása dbms_xplan package segítségével

   - 1.lépés: Készítsük el az utasítások végrehajtási tervét a a PLAN_TABLE táblába:

EXPLAIN PLAN [SET statement_id='utasitas_egyedi_neve'] [INTO sajat_plan_table]
FOR SELECT ... 
 
   - 2.lépés: A végrehajtási tervek megjelenítése a dbms_xplan package segítségével

set markup html preformat on

SELECT plan_table_output
FROM table(dbms_xplan.display('saját_plan_table','utasitas_egyedi_neve','all'));
-- paraméterek: első két paraméter lehet null vagy tábla_név ill. statement_id,
   harmadik paraméter pedig a részletesség (basic, typical, all, serial)

set markup html preformat off   

C.) vagy egyszerűen csak

   - 1.lépés: Készítsük el az utasítások végrehajtási tervét a a PLAN_TABLE táblába:

EXPLAIN PLAN FOR SELECT ... 
 
   - 2.lépés: A végrehajtási tervek megjelenítése a dbms_xplan package segítségével: 

SELECT plan_table_output FROM
table(dbms_xplan.display);

_______________________________________________________________
1.feladat:
Lekérdezések és végrehajtási tervek (index nélkül illetve indexek létrehozásával)
az Oracle EMP, DEPT, SALGRADE alaptáblái alapján

 
- Az ORAUSER felhasználó EMP,DEPT és SALGRADE (fizetési kategóriák)
   tábláiból hozzunk létre saját példányokat (lásd script - fontos, hogy itt a lap tetején
   leírtak szerint hozzuk létre az ORAUSER vagy SILA felhasználó meglévő tábláiból
   a saját példányainkat, vagy ha közvetlenül hozzuk létre, akkor vegyük ki a scriptből
   a megszorításokat, vagyis megszorítások és indexek nélkül használjuk a tábláinkat). 
- A saját  EMP,DEPT,SALGRADE táblákra vonatkozóan:
   Adjuk meg azoknak az osztályoknak a neveit, amelyeknek van olyan dolgozója,
   aki az 1-es fizetési kategóriába esik.
 
- Ezután hozzunk létre indexet valamelyik táblához, majd adjuk meg a rendszer
   által létrehozott új végrehajtási tervet. Olyan indexeket hozzunk létre, amit
   a lekérdezésben használni tud a rendszer és ez legyen is látható az új tervből.
 
- Lásd még a tervek1.txt feladatait (egyszerűbb és bonyolultabb lekérdezések
   végrehajtási tervei, valamint különböző megszorítások és indexek hozzáadásával
   milyen változások történnek ezeken a végrehajtási terveken?)
_______________________________________________________________
2.feladat:
Lekérdezések
és végrehajtási tervek (megváltoztatása hintek segítségével)
NIKOVITS.CIKK, SZALLITO, PROJEKT, SZALLIT táblái alapján
 
- A lekérdezésekhez  NIKOVITS felhasználó tulajdonában levő táblákat használjuk: 
  CIKK(ckod, cnev, szin, suly)
  SZALLITO(szkod, sznev, statusz, telephely)
  PROJEKT(pkod, pnev, helyszin)
  SZALLIT(szkod, ckod, pkod, mennyiseg, datum)
 
- Vagyis most ne hozzunk létre saját példányokat, hanem egy adott séma tábláit
   használjuk a lekérdezéseknél, a táblák elérése: NIKOVITS.<táblanév>
- A táblákhoz különböző indexek is vannak létrehozva, ezek tulajdonságait
   a katalógusokból (dba_nézetekből) nézhetjük meg, amikor szükségünk van rá.
 
NIKOVITS felhasználó tulajdonában levő táblákra adjuk meg a lekérdezést
  és a hozzá tartozó végrehajtási terv fa struktúráját  (mentsük is le szövegfájlba).
- Adjuk meg a piros cikkekre vonatkozó szállitások összmennyiségét.
  Ezt a feladatot a következő héten folytatjuk a hintek hozzáadásával!
 
- Lásd még a tervek2.txt feladatait!
_______________________________________________________________
Kötelező házi feladat:
Kérem, hogy a mai gyakorlat lekérdezéseit és végrehajtási terveit a mai óra végén
vagy legkésőbb a következő gyakorlatig  küldje be emailben "<ehakod>_8gy.txt"
nevű szöveges fájlban (ahol az <ehakod> helyére a saját ETR azonosító kerüljön).  
  
 Vissza az AB2 gyakorlat oldalára             Vissza a Kezdőlapra