Adatbázisok EA+GY - Lekérdezések
végrehajtása,
optimalizálás
--- --- --- ---
> Emlékeztető: 5.rész Indextáblák,
lásd az előző 4.3.feladatsor
(5.rész)
-- Molina-Ullman-Widom:
Adatbázisrendszerek
megvalósítása, Panem, 2001.
4.fejezete -> Indexstruktúrák.pdf -->>
Innen a fontosabb részletek:
Elsődleges indexek, Másodlagos
indexek, B-fák, Hasító
indexek
-->> lásd még
Molina-Ullman könyv: B-fák
és Hasító indexek.pdf
-- Oracle
Példák 1/10.lecke
és 2/1.lecke
SQL DDL (megszorítások,
indexek)
>>
OracleDoc:
SQL Language Reference
>> innen CREATE
INDEX
példák
>>
Alapfogalmak Oracle
Database Concepts
például Concepts
(11g) 3.fej. Indexek vagy Concepts
(10g) 5.fej.Indexek
-- Feladatok [Lásd 5.rész] Hozzunk
létre a
tábláinkhoz különböző
indexeket,
lásd create index
példák.txt
legyen köztük
több oszlopos, csökkenő
sorrendű,
függvény
alapú, fordított kulcsú
(reverse), bitmap
index. Majd állapítsuk meg
ezeknek az indexeknek a
különböző tulajdonságait
az alábbi
katalógusokból:
DBA_INDEXES,
DBA_IND_COLUMNS, DBA_IND_EXPRESSIONS
--- --- --- ---
> 6.gépes rész: Index
szervezett táblák, IOT részei (index,
tábla) lásd IOT.txt
> OracleDoc:
Concepts
>> 3
Overview of Index-Organized Tables
>
Állapítsuk meg az IOT
táblák a
különböző tulajdonságait
a
katalógusokból.
DBA_INDEXES,
DBA_TABLES,
DBA_OBJECTS,
DBA_SEGMENTS
6.01. Hozzuk létre a IOT.txt
segédletben szereplő cikk_iot indexszervezésű
táblát.
Adjuk meg mely
felhasználók tulajdonában vannak ezek
('CIKK_IOT'-vel
kezdődő) index-szervezett táblák.
Adjuk
meg a táblák
és
táblaterek nevét is.
(Melyik
táblatéren vannak ezek a
táblák? ->
miért nem látható?)
6.02. Adjuk meg a fenti
táblák index
részét, és azt, hogy ezek az index
részek (szegmensek)
melyik
táblatéren vannak? Keressük meg
a szegmensek
között az előző táblákat
illetve
indexeket, és
adjuk meg a
méretüket. Keressük meg az
adatbázis objektumok
között a fenti
táblákat
és indexeket, és
adjuk meg az objektum
azonosítójukat és
adatobjektum
azonosítójukat (DBA_INDEXES,DBA_TABLES,DBA_OBJECTS).
6.03. Adjuk meg a fenti
táblák túlcsordulási
részeit (ha van). Keressük meg
a
túlcsordulási részeket a
szegmensek
között és
adjuk meg a
méretüket.
Keressük meg az objektum
azonosítóikat és az adatobjektum
azonosítóikat is.
6.04. Adjuk meg azokat az index szervezett
táblákat,
amelyeknek pontosan egy
dátum
típusú oszlopa van.
--- --- --- ---
> 7.papíros rész: lásd 9ituning 83-84.o:
Bitmap index + Oracle
Concepts doksi
Molina-Ullman-Widom:
Adatbázisrendszerek
megvalósítása, Panem, 2001.
Adattárházaknál
hasznos: 5.4. Bittérképindexek
szakaszhossz_kodolas.pdf
> Oracle Doc:
Concepts
>> 3
Overview of Indexes
> Oracle10g Concepts >> 5. Schema Objects >>Overview
of Indexes
--- --- --- ---
> 8.papíros rész: Lekérdezések
végrehajtása (7.fej)
Optimalizálás két
módja:
(1) Heurisztikus szabályokon
alapuló optimalizálásl: rAlgOpt.pdf
(2) Költség alapú
optimalizálás: Végrehajtási
tervek, költségek: VegrKolts.pdf
Feladatok: Adjuk
meg, hogy az egyes algoritmusok hogyan működnek
és
adjuk meg a műveletek
költségbecslését (I/O blokkok
számát).
Tankönyv:
Molina-Ullman-Widom: Adatbázisrendszerek
megvalósítása, 2001.
Tk.2.3.fejezete: Adatok
rendezése másodlagos
tárolókon
- Tegyük fel, hogy a
dolgozó
tábla 140 sorból áll és
10 sora fér el 1 blokkban,
és a
memóriánk 4 blokknyi. Rendezzük
a tábla
sorait fizetés
szerint a
kétfázisú többutas
összefésülő rendezéssel
(sort-merge algoritmussal).
Adjuk meg az
első menet után a
rendezett részlistákat (elég
a dnev,
fizetes).
Hány menetes algoritmusra
lesz
szükségünk? optimization-pp17-22.pdf
Tk.6.fejezet:
Lekérdezések végrehajtása,
műveletek I/O költsége
- Tegyük fel, hogy a dolgozó
tábla 140 sorból áll és
10 sora fér el 1 blokkban,
és a
memóriánk
most 6
blokknyi és van még egy
vásárlás
tábla, amelynek
a
szerkezete a következő: VASARLAS(dkod, cikk, mennyiseg, ar).
Ennek a
táblának is 10 sora fér el 1
blokkban, és a tábla kb.1200 sorból
áll.
Mennyi a műveletigénye
- egy
beágyazott ciklusú
algoritmusnak nested_loop_algoritmus.pdf
- egy rendezés
alapú algoritmusnak sort_join_algoritmus.pdf
- egy hash
alapú algoritmusnak hash_join_algoritmus.pdf
amely egyenlőséges
összekapcsolást (equijoin) végez a
két
táblán, arra a
lekérdezésre
válaszol, hogy az
egyes
dolgozók összesen mennyit
költöttek?
Feltehetjük, hogy az
összegeket gyűjtő
számlálók még
beférnek a memóriába
a blokkok
mellett. Írjuk
le röviden, hogy az egyes algoritmusok hogyan fognak
működni. Adjuk meg a
kosarakat a
hasítás alapú
algoritmus első menete után.
--- --- --- ---
> 9.gépes rész:
Végrehajtási tervek
előállítása
ZH
illetve beküldendő
feladatoknál egyszerű
szöveges .txt állományba
bemásolva
1.) SELECT
/*+ tipp lista */ ... vagyis
a lekérdezés
(hintekkel együtt),
2.) lekérdezés
outputja
("SCIPT OUTPUT"-ból az
eredménytábla első
5
sorát),
3.) végrehajtási
tervek
szöveges
megjelenítése ("EXPLAIN
PLAN OUTPUT"-ból)
-- Ehhez az
1.lépés:
Készítsük el az
utasítások végrehajtási
tervét:
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);
Példák: Oracle
9i példákat futtassuk le
Oracle 11gR2-ben, figyeljük meg a
változást:
--- 9ituning
6-8.o: Áttekintés.pdf,
--- 9ituning 27-40.o:
Indexes.pdf,
--- 9ituning 48-55.o:
Joins.pdf
--- 9ituning
75-76.o: Hints.pdf
Feladatok:
Lekérdezések
és
végrehajtási tervek az EMP,
DEPT,
SALGRADE táblák alapján
Három lépésben
végezzük el a végrehajtási
tervek előállítására a
feladatokat:
a.) 1.lépcső: 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 create_dept_no_constr.txt -
fontos,
hogy először kulcs
és
integritási
megszorítások nélkül hozzuk
létre a
saját tábláinkat!
Legelőször
így megszorítások
és indexek
nélkül
fogjuk használni a saját
tábláinkat, és
minél
változatosabb
és érdekesebb
lekérdezéseket próbáljunk
ki a táblákon, miközben
nézzük
meg a végrehajtási
terveket (és mentsük is le egyszerű .txt
szöveges
állományba).
b.) 2.lépcső:
Most
megszorításokkal együtt hozzuk
létre a táblákat, lásd create_dept_const.txt
és az előző
lekérdezéseket újból
futtatva nézzük meg mi változott a
végrehajtási
terveken.
c.) 3.lépcső: Ezután
hozzunk létre
olyan (különböző
típusú) indexeket
a táblákhoz, amelyeket
a fenti
lekérdezésekben használni
tud a
rendszer, majd
adjuk meg a
fenti lekérdezésekhez
a
rendszer által
létrehozott új
végrehajtási terveket (most már az
indexek használatával).
Figyeljük meg, hogy a
különböző
megszorítások és indexek
hozzáadásával milyen
változások
történnek a
korábbi végrehajtási
terveken? (ezeket a
terveket is mentsük le).
Feladatok -
lekérdezések:
- A saját EMP,DEPT,SALGRADE táblákra vonatkozóan
adjunk meg lekérdezéseket
és a hozzájuk
tartozó
végrehajtási tervek fa
struktúráját.
Adjunk meg szűrőfeltételeket,
különböző
összekapcsolásokat
(például külső joint is), majd adjunk
meg
bonyolultabb
lekérdezéseket,
vagyis nézzük meg
az alkérdéseket (NOT IN
és NOT
EXISTS
is),
a korrelált
alkérdéseket,
csoportosítást, group by .. having ..
záradékokat, halmaz- és
multihalmaz műveleteket,
továbbá az inline
nézeteket tartalmazó
lekérdezéseket, stb,
és állítsuk elő
(mentsük le szöveges fájlba) a
hozzájuk
tartozó végrehajtási terveket.
Példák a
feladatokra:
a.) Adjuk meg a dolgozók adatait és
azt is, hogy milyen elnevezésű osztályon
dolgoznak,
vagyis az EMP és
a DEPT
táblák különböző
összekapcsolásaira (left/right outer-joinra is)
nézzük meg a régi
illetve az
új
szintaxissal megadott lekérdezésekre a
végrehajtási terveket.
A joint fejezzük ki IN
(alkérdéssel)
illetve
korrelált EXISTS (alkérdéssel) is:
semi-join.
b.) Adjuk
meg azoknak az
osztályoknak a nevét
és telephelyét (LOC), amelyeknek van
olyan dolgozója, aki hivatalnok
(UPPER(JOB)=CLERK)
és akinek a fizetése (SAL)
az 1-es fizetési
kategóriába esik (vagyis GRADE=1
sorban megadott LOSAL
és HISAL
értékek
közé esik a fizetés: theta-join)
és
már legalább 20 éve
munkában áll (HIREDATE).
c.) Adjuk meg azoknak az osztályoknak az
azonosítóját, nevét
és az
osztályon dolgozók
átlagfizetését,
amely
osztályoknak nincs olyan dolgozója, aki a 3-as
fizetési kategóriába
esik. Tehát itt a nincs olyan
dolgozókra korrelált NOT EXISTS
(alkérdés) lesz: anti-join.
- Ezután hozzunk létre
olyan indexeket
a táblákhoz, amelyeket a fenti
lekérdezésekben
használni tud a rendszer, majd
adjuk meg a
fenti lekérdezésekhez a
rendszer által
létrehozott új
végrehajtási terveket (most már az
indexek használatával).
A különböző
megszorítások
és indexek
hozzáadásával milyen változások
történnek
a korábbi
végrehajtási terveken?
(mentsük is el a végrehajtási terveket
szöveges
fájlba).
lásd még tervek1.txt
--- --- --- ---
> 10.gépes rész:
Végrehajtási tervek
megváltoztatása hintek
segítségével
--- Segédanyagok:
- Oracle Database Documentation Library:
Sample
Schemas HTML
PDF
HR
- Human Resource: Figure
4-1 HR and OE Schemas
SH
-Sales History: Figure
4-3 SH Schema
- Oracle 11g Doc. Performance Tuning
Guide 11-21.fejezetek HTML
PDF
Emlékeztető:
Hintekről: 19.
Using Optimizer Hints
>> hintek.txt
--- Feladatok:
- A
lekérdezésekhez az Oracle demo
tábláit, a HR és SH
sémához
tartozó táblákat
használjuk, 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: HR.<táblanév>,
SH.<táblanév>
- A táblákhoz
különböző
indexek is vannak
létrehozva, ezek tulajdonságait a
katalógusokból
(dba_ind_columns)
nézhetjük meg, amikor
szükségünk van rá.
- Adjuk meg azoknak a vevőknek a nevét
(SH.CUSTOMERS),
akik nőneműek (vagyis
cust_gender =
'F') és szinglik
(vagyis cust_marital_status =
'single'), vagy
1917 és 1920
között
születtek.
a) Vegyük rá az
Oracle-t, hogy a
meglévő bitmap indexek alapján érje el
a
tábla sorait.
b) Vegyük rá, hogy
ne használja ezeket az indexeket.
- Lásd még a tervek.txt
és a hint_peldak.txt