PL-SQLDeveloper használat sql optimalizáció
- Szintaxis: A hint-eket a lekérdezésben egy speciális kommentben adjuk meg, közvetlenül a SELECT, INSERT, UPDATE vagy DELETE kulcsszó után. Példa:
SELECT /*+ INDEX(emp emp_idx) */ employee_id, first_name
FROM employees emp
WHERE employee_id = 100;
- Főbb hint típusok:
- Hozzáférési útvonalak: FULL (teljes tábla szkennelés), INDEX (index használata), INDEX_FFS (index gyors szkennelés).
- Join módszerek: USE_NL (nested loop), USE_HASH (hash join), USE_MERGE (merge join).
- Párhuzamos végrehajtás: PARALLEL (párhuzamos lekérdezés), NO_PARALLEL.
- Optimalizációs célok: ALL_ROWS (teljes adatmennyiség optimalizálása), FIRST_ROWS(n) (első n sor gyors visszaadása).
- Egyéb: LEADING (join sorrend meghatározása), ORDERED (táblák sorrendje a join-ban).
🔧 Tipikus hint típusok:
Hint | Funkció |
---|---|
FULL(table) | Teljes táblaszkennelést kér |
INDEX(table index) | Megadott index használatát kéri |
USE_NL(table) | Nested loop join használata |
USE_HASH(table) | Hash join használata |
LEADING(table) | Megadja a join sorrendet |
PARALLEL(table, n) | Párhuzamos végrehajtás kérése |
MERGE(table) | Merge join használata |
- Teljesítményjavítás: A hint-ek segítségével kikényszeríthetjük a hatékonyabb végrehajtási tervet, ha az optimalizáló nem választja automatikusan a legjobb utat.
- Rugalmas finomhangolás: Lehetővé teszik a lekérdezés specifikus körülményekhez igazítását (pl. adatmennyiség, indexek, hardver).
- Gyors beavatkozás: Nem igényel séma- vagy adatbázis-struktúra módosítást.
- Statikus jelleg: A hint-ek fix utasítások, így ha az adatmennyiség vagy a statisztikák változnak, a hint elavulhat, és akár rontja is a teljesítményt.
- Fenntartási teher: A hint-ek kódba ágyazása megnehezíti a karbantartást, különösen nagy rendszerekben.
- Nem garantált hatás: Az optimalizáló figyelmen kívül hagyhatja a hint-eket, ha azok érvénytelenek vagy ellentmondásosak (pl. nem létező indexre hivatkoznak).
- Szakértelem igénye: A helytelen hint-ek használata jelentősen ronthatja a lekérdezés teljesítményét.
- Csak indokolt esetben használjuk: Ha az optimalizáló rossz végrehajtási tervet választ, és a statisztikák naprakészek.
- Tesztelés: Mindig teszteljük a hint-ek hatását különböző adatmennyiségeken és környezetekben.
- Dokumentáció: Jól dokumentáljuk a hint-ek célját a kódon belül, hogy később érthető legyen a szándék.
Korlátok:
-
Rossz hint → rosszabb teljesítmény (több idő, erőforrás).
-
Version dependency: Új Oracle verzióban máshogy viselkedhet.
-
Nehéz karbantartani nagy rendszerekben.
-
Nem veszi figyelembe automatikusan a statisztikák változását.
- Nem változtatja meg a SQL-t.
- A háttérben finomhangolja a szelektivitási becsléseket és a költségmodellezést.
- Hatására az optimalizáló jobb végrehajtási tervet választhat.
Korlátok:
-
Csak egy konkrét SQL statement-re vonatkozik (normál formázással).
-
Nem kényszerít végrehajtási tervet – csak javasol.
-
Nem exportálható könnyen más környezetbe (bár workaroundok léteznek).
-
Ha a statisztikák jelentősen változnak, újra kell generálni.
- Létrehozás:
- Az SQL Tuning Advisor elemzi a lekérdezést, és javaslatokat tesz a végrehajtási terv javítására.
- Ha a javaslat elfogadásra kerül, az Oracle egy SQL profilt hoz létre, amely a lekérdezéshez kapcsolódik.
- A profil a DBA_SQL_PROFILES nézetben tárolódik, és a lekérdezés hash-értékéhez kötődik.
- Példa SQL profil elfogadására:
BEGIN
DBMS_SQLTUNE.ACCEPT_SQL_PROFILE(task_name => 'my_tuning_task');
END;
- Tartalom: Az SQL profil tartalmazhat:
- Statisztikai korrekciókat (pl. jobb kardinalitásbecslések).
- Információkat a join sorrendről, indexhasználatról vagy párhuzamos végrehajtásról.
- Az optimalizáló számára "puha" javaslatokat, amelyeket az figyelembe vehet.
- Automatikus optimalizálás: Az SQL profil dinamikusan alkalmazkodik az adatbázis változásaihoz, mivel nem fix utasításokat tartalmaz, hanem statisztikai korrekciókat.
- Karbantartásmentes: Nem igényel SQL kód módosítást, így könnyen kezelhető nagy rendszerekben.
- Stabilitás: Segít fenntartani a jó végrehajtási tervet, még akkor is, ha az adatmennyiség vagy a statisztikák változnak.
- Nem minden esetben alkalmazható: Az SQL profilok csak akkor hatékonyak, ha a CBO rossz döntései statisztikai hibákból fakadnak.
- Nem garantált javulás: Ha a lekérdezés strukturális problémákat tartalmaz (pl. rossz séma design), az SQL profil nem oldja meg a problémát.
- Licencigény: Az SQL profilok használata az Oracle Enterprise Edition részeként az Oracle Tuning Pack licencet igényli.
- Korlátozott hatókör: Nem helyettesíti a hint-eket olyan esetekben, ahol specifikus végrehajtási tervet kell kikényszeríteni.
- SQL Tuning Advisor használata: Rendszeresen futtassuk az SQL Tuning Advisort a problémás lekérdezések azonosítására.
- Profilok monitorozása: Ellenőrizzük a DBA_SQL_PROFILES nézetet, hogy mely profilok aktívak, és szükség esetén frissítsük vagy töröljük őket.
- Kombinálás más eszközökkel: Az SQL profilok jól működnek más optimalizációs eszközökkel, például indexekkel vagy particionálással.
Tulajdonság | Hint-ek | SQL Profilok |
---|---|---|
Működés | Direktívák az SQL kódban, amelyek közvetlenül befolyásolják a CBO-t. | Statisztikai metaadatok, amelyek finomhangolják a CBO döntéseit. |
Hatás | Fix végrehajtási terv kikényszerítése, azonnali hatás. | Dinamikus, statisztikai alapú optimalizálás, hosszabb távú stabilitás. |
Rugalmasság | Statikus, nem alkalmazkodik az adatváltozásokhoz. | Dinamikus, alkalmazkodik az adatbázis változásaihoz. |
Karbantartás | Magas, a kód módosítása szükséges, elavulhat. | Alacsony, automatikus, nem igényel kódmódosítást. |
Szakértelem igénye | Magas, mély adatbázis-ismeret szükséges a helyes hint kiválasztásához. | Közepes, az SQL Tuning Advisor automatikus javaslatokat ad. |
Licencigény | Nincs, alap Oracle funkcionalitás. | Oracle Tuning Pack licenc szükséges (Enterprise Edition). |
Korlátozások | Elavulhat, figyelmen kívül hagyható, karbantartási teher. | Nem minden lekérdezésre alkalmazható, nem helyettesíti a strukturális javításokat. |
Használati esetek | Specifikus végrehajtási terv kikényszerítése, gyors beavatkozás. | Általános teljesítményjavítás, statisztikai hibák korrigálása. |
Példa | /*+ INDEX(emp emp_idx) */ | DBMS_SQLTUNE.ACCEPT_SQL_PROFILE(task_name => 'my_tuning_task') |
📋 Összefoglaló táblázat: Oracle Hints vs SQL Profiles
Jellemző | Oracle Hints | SQL Profiles |
---|---|---|
Típus | Kézi utasítás az optimalizálónak | Automatikus, tanuló alapú korrekció |
Hatás | Közvetlen (azonnal irányítja a CBO-t) | Közvetett (stat. alapú módosítás) |
Láthatóság | SQL-ben benne van | Csak DBA-nak látható, metadata-ban tárolt |
Alkalmazhatóság | Az adott SQL-ben | Az adott SQL ID-ra automatikusan |
Karbantarthatóság | Nehézkes nagy rendszerekben | Automatizálható, jobban kezelhető |
Garancia a végrehajtásra | Nincs (érvénytelen hint esetén elhagyja) | Nincs (csak tanács a CBO-nak) |
Verziófüggőség | Igen | Igen |
Tuning Advisor használja? | Nem (kézi) | Igen (automatikus ajánlás) |
Kódot kell módosítani? | Igen | Nem |
Használat tipikusan | Ad hoc tuning, tesztelés | Production tuning, hosszú távú optimalizálás |
- Először a statisztikákat ellenőrizd: Győződj meg róla, hogy az adatbázis statisztikái naprakészek (DBMS_STATS.GATHER_TABLE_STATS).
- SQL Tuning Advisor használata: Először próbálj SQL profilt generálni, mert ez kevésbé invazív és dinamikusabb megoldás.
- Hint-ek csak végső esetben: Használj hint-eket, ha a profil nem hoz eredményt, vagy pontosan tudod, milyen végrehajtási tervre van szükség.
- Monitorozás és tesztelés: Mindig mérd a teljesítményt (EXPLAIN PLAN, SQL Trace, TKPROF) a változtatások előtt és után.
- Kombinált megközelítés: Az SQL profilokat és hint-eket együtt is használhatod, ha szükséges, de figyelj az esetleges konfliktusokra.
Most nézzük tovább az Oracle SQL optimalizálási eszközeit, különösen a SQL Plan Management (SPM) részeként elérhető:
-
SQL Plan Baselines
-
SQL Plan Management maga
A végén csatolok egy összefoglaló táblázatot az eddig tárgyalt négy technikáról (Hints, SQL Profiles, SQL Plan Baselines, SPM) verziókkal és jellemzőkkel.
🧠 3. SQL Plan Baselines – Végrehajtási terv rögzítés
📌 Mi ez?
Az Oracle SQL Plan Baseline lehetővé teszi, hogy megbízható végrehajtási terveket rögzítsünk egy SQL lekérdezéshez, és megakadályozzuk, hogy az optimalizáló más, potenciálisan rosszabb tervet válasszon.
Ez különösen hasznos:
-
verzióváltások után,
-
statisztikai változásoknál,
-
változó környezeti feltételek esetén.
✅ Működés:
-
Amikor egy SQL-t először hajtunk végre, az Oracle létrehozhat egy baseline-t (ha engedélyezve van az SPM).
-
Ez a baseline tartalmazza az adott lekérdezéshez tartozó jóváhagyott végrehajtási terveket.
-
Csak ezek a jóváhagyott tervek hajthatók végre, hacsak nincs evolúció (új terv validálása és engedélyezése).
Alapfogalmak:
- Baseline: Egy jóváhagyott végrehajtási terv, amelyet az adatbázis tárol és használhat a lekérdezésekhez. A baseline-ek tartalmazzák a végrehajtási tervet és a hozzá kapcsolódó statisztikai információkat.
- SQL Plan History: Az adott SQL lekérdezéshez tartozó összes végrehajtási terv gyűjteménye, amelyeket az SPM tárol (elfogadott és nem elfogadott tervek egyaránt).
- Enabled/Accepted: Egy baseline lehet engedélyezett (enabled) és elfogadott (accepted). Csak az elfogadott baseline-eket használja a CBO.
- Fixed: Egy fix baseline-t az optimalizáló előnyben részesít más tervekkel szemben, így garantálja annak használatát.
Folyamat:
- Rögzítés (Capture): Az SPM automatikusan vagy manuálisan rögzíti a végrehajtási terveket. Az automatikus rögzítés az OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES paraméter bekapcsolásával történik.
- Tárolás: A rögzített tervek a DBA_SQL_PLAN_BASELINES nézetben tárolódnak, és az SQL lekérdezéshez kapcsolódnak a signature (hash érték) alapján.
- Értékelés (Evaluation): Az SPM összehasonlítja az új végrehajtási terveket a meglévő baseline-ekkel, és csak akkor fogad el új tervet, ha az bizonyítottan jobb (pl. alacsonyabb költségű vagy gyorsabb).
- Evolúció (Evolution): Az SPM lehetővé teszi az új, potenciálisan jobb tervek fokozatos bevezetését az DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE eljárással, amely teszteli az új terveket, mielőtt elfogadja őket.
- Karbantartás: A baseline-eket törölhetjük, módosíthatjuk vagy fixálhatjuk a DBMS_SPM csomag segítségével.
🔧 Használat:
🕒 Elérhető verzió:
-
Oracle 11g óta elérhető.
-
Oracle 12c+ és 19c/21c-ben továbbfejlesztve (pl. automatikus evolúció).
⚠️ Korlátai:
-
Baseline karbantartás szükséges.
-
Növeli a tárhasználatot (metadata).
-
Ha túl sok baseline van egy SQL-hez, az lassítja a parse fázist.
🔐 4. SQL Plan Management (SPM) – Tervezett stabilitás
📌 Mi ez?
Az SQL Plan Management egy Oracle technológia, amely célja, hogy stabil és megbízható teljesítményt biztosítson az SQL lekérdezések számára az idő múlásával. Ez egy keretrendszer, amely a következőket foglalja magába:
-
SQL Plan Baselines
-
Evolúciós folyamat (automatikus vagy manuális)
-
Plan capture és választás szabályai
✅ Működés:
-
SPM automatikusan rögzíti az SQL-eket és azok terveit.
-
Alapértelmezetten csak elfogadott baseline hajtható végre.
-
Az új tervek csak tesztfázis után válhatnak elfogadottá.
⚙️ Beállítások:
🔍 SQL Plan evolúció:
-
Az Oracle 12c+ verziók automatikus evolúciót támogatnak (
DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE
). -
A tuning advisor és automatikus background task is végzi.
🕒 Elérhető verzió:
-
Alap: Oracle 11g
-
Automatikus evolúció és profil integráció: Oracle 12c+
⚠️ Korlátai:
-
Bevezetése komplexitást jelenthet.
-
Nem végtelenül skálázható: baseline menedzsment fontos.
-
Lassíthatja a parse időt, ha túl sok baseline van.
🧾 Végső táblázatos összefoglaló: Oracle SQL optimalizálási eszközök
Jellemző | Oracle Hints | SQL Profiles | SQL Plan Baselines | SQL Plan Management (SPM) |
---|---|---|---|---|
Bevezetés verzió | Mindig elérhető | Oracle 10g | Oracle 11g | Oracle 11g |
Típus | Kézi, SQL szintű | Automatikus, statisztikai | Rögzített végrehajtási terv | Keretrendszer: baseline + szabályok |
Hatás | Azonnali irányítás | Szelektivitás korrekció | Csak jóváhagyott terv fut | Stabil teljesítmény hosszú távon |
Kódmódosítás szükséges? | Igen | Nem | Nem | Nem |
DBA eszköz szükséges? | Nem | Igen | Igen | Igen |
Automatizálható? | Nem igazán | Igen (Tuning Advisor) | Igen (evolúcióval) | Igen (12c+ automatikus evolúció) |
Statisztika változás hatása | Nem érzékeny | Igen (új profilt igényel) | Rögzített → stabil marad | Stabil marad, amíg új baseline nincs elfogadva |
Használat célja | Teszt, gyors tuning | Finomhangolás | Stabil, bevált terv zárolása | Központi teljesítménykontroll |
Export/import lehetőség | N/A | Bonyolult | Igen (DBMS_SPM ) | Igen |
Készítettem egy gyakorlati példát, amely végigvezet egy egyszerű SQL lekérdezésen, és bemutatja a következő Oracle optimalizálási eszközöket:
-
HINT használata
-
SQL PROFILE létrehozása
-
SQL PLAN BASELINE rögzítése
-
SQL PLAN MANAGEMENT beállítása és használata
A példát egy employees
tábla alapján készítem, amely tartalmazza a következő mezőket:
Tegyük fel, hogy a következő lekérdezésünk van, amit szeretnénk optimalizálni:
🛠 1. Hint használata – kézi optimalizáció
Cél: Index használatának kényszerítése.
🔍 Ezzel megmondjuk az Oracle-nek, hogy a emp_dept_idx
indexet használja.
⚠️ Ha a hint nem valid (pl. rossz indexnév), az Oracle figyelmen kívül hagyja.
🤖 2. SQL Profile létrehozása – SQL Tuning Advisor segítségével
Lépések:
-
Először létrehozunk egy tuning task-et:
-
Lefuttatjuk a tuningot:
-
Megnézzük az ajánlásokat:
-
Ha a rendszer ajánl SQL PROFILE-t, elfogadhatjuk:
🧠 Ekkor az Oracle belsőleg finomítja a költségmodellezést (szelektivitási becslést), de nem módosítja az SQL-t.
📦 3. SQL Plan Baseline létrehozása
Cél: A jelenlegi, jól teljesítő végrehajtási terv rögzítése.
-
Engedélyezzük a baseline-ok automatikus rögzítését (ha nem aktív):
-
Végrehajtjuk a lekérdezést (Oracle ekkor létrehozhat baseline-t).
-
Alternatív mód: baseline manuális betöltése a cache-ből:
-
Megnézhetjük a baseline-t:
🔐 4. SQL Plan Management (SPM) használata
Beállítás:
Evolúció (új terv elfogadása baseline-hoz):
Az SPM gondoskodik arról, hogy csak validált tervek fussanak, még akkor is, ha az Oracle új tervet találna, de az lassabb lenne.
🧾 Összegzés – egy SQL lekérdezés és az optimalizációs lépések:
Eszköz | Hatás | SQL módosítást igényel? | Automatizálható? |
---|---|---|---|
Hint | Index vagy join típus kényszerítése | Igen | Nem |
SQL Profile | Szelektivitási becslések pontosítása (jobb terv) | Nem | Igen |
SQL Plan Baseline | Csak a jóváhagyott végrehajtási terv használható | Nem | Igen |
SPM | Stabil végrehajtási terv kontroll hosszú távon, evolúcióval | Nem | Igen |
Most modellezzük le részletesen, hogyan tudjuk vizsgálni és összehasonlítani egy SQL lekérdezés végrehajtási tervét (execution plan) az Oracle optimalizálási technikák használata előtt és után.
Két módszert mutatok be:
-
EXPLAIN PLAN FOR
+DBMS_XPLAN.DISPLAY
-
SET AUTOTRACE ON
SQL*Plus-ban vagy SQLcl-ben
🎯 Alap lekérdezés
Tegyük fel, hogy a dept_id
mezőre van egy index:
🔍 1. EXPLAIN PLAN – optimalizáció előtt (baseline, profile, hint nélkül)
A. Parancs:
Ezután nézzük meg a tervet:
🧾 Példa kimenet:
🔴 FULL TABLE SCAN → az Oracle nem használja az indexet.
✅ 2. Hint használatával (kézzel irányítjuk az optimalizálót)
📄 Várható terv:
🟢 Az indexet már használja → gyorsabb végrehajtás.
🧠 3. SQL Profile vagy Baseline után
Miután a tuning advisor javasolt egy SQL PROFILE-t, vagy létrehoztál egy baseline-t, a futtatás után így vizsgálhatod:
Az Oracle figyelembe veszi a profilokat és baseline-okat is, így a terv automatikusan változhat:
📄 Várható output SQL Profile vagy Baseline után:
🧩 A tuning hatására a rendszer magától választotta a jobb tervet, még ha nem is írtunk hint-et.
⚙️ 4. AUTOTRACE – gyors teszt SQL*Plus-ban vagy SQLcl-ben
Ez lefuttatja a lekérdezést ÉS mutatja az execution plan-t + statisztikákat:
Példa kimenet:
🧾 Összegzés – mit látunk a végrehajtási tervben?
Elem | Jelentés |
---|---|
TABLE ACCESS FULL | Teljes táblaszken → lassabb |
INDEX RANGE SCAN | Index alapján keresés → gyorsabb |
PLAN_HASH_VALUE | Azonosító, hogy két terv azonos-e |
Cost / Rows / Bytes | Oracle becslése a lekérdezés erőforrásigényére |
* a predicate sorban | Szűrés (WHERE feltétel) alkalmazva |
Most bemutatok egy Oracle SQL optimalizálási folyamatot automatizáló ütemezhető szkriptet, amely Python és/vagy PL/SQL segítségével:
🎯 Cél:
-
Automatizáltan elvégezni egy lekérdezés SQL tuningját.
-
Elfogadni a javasolt SQL Profile-t (ha van).
-
Kinyerni és naplózni az execution plan-t.
-
Mindezt naponta (vagy tetszőleges időzítéssel).
🧩 Megoldás 1: Python szkript ütemezése cron
vagy Task Scheduler
segítségével
📄 Fájl neve: sql_tuning_runner.py
🕒 Linuxon ütemezés cron
-nal:
Tegyük be pl. naponta 2:00-kor:
🪟 Windows ütemezés:
Használj Task Schedulert, és állítsd be a szkript futtatását pl. python sql_tuning_runner.py
paranccsal, egy adott időpontra naponta.
🧩 Megoldás 2: PL/SQL ütemezés Oracle belső időzítővel
Használhatod az DBMS_SCHEDULER
-t az Oracle-en belül:
🧾 Naplózás – javasolt kimenet formátum
Az output fájlban vagy az Oracle USER_SCHEDULER_JOB_RUN_DETAILS
nézetében követheted a futásokat.
🧠 Tuning Jelentés ellenőrzése
A tuning report kiemeli, ha az Oracle javasol:
-
Index létrehozást
-
SQL Profile elfogadását
-
Hibatűrési optimalizálást
-
Join újrasorrendezését
🔚 Összegzés
Megoldás | Technológia | Időzítés | Naplózás | Profil használat |
---|---|---|---|---|
Python szkript + cron | cx_Oracle | OS szinten | fájlba (.log ) | ✅ |
PL/SQL blokk + DBMS_SCHEDULER | Oracle belső | Oracle szinten | Oracle nézet | ✅ |
Megjegyzések
Megjegyzés küldése