minden SQL lekérdezésnek három (négy – SELECT esetén) szakaszon kell keresztülmennie. Először is, az Oracle egy megfelelő SQL kivonatot keres a könyvtár gyorsítótárában. Ha a hash megtalálható, akkor csak letölteni a kapcsolódó magyarázza tervet, és végrehajtja azt. Ha nem, akkor egy kemény elemzés kerül meghívásra – > ez azt jelenti, hogy a következő lépéseket kell végrehajtani.
- elemzés
- szintaxis ellenőrzés
- szemantikai ellenőrzés
- jogosultságok ellenőrzése
- BIND
- cserélje ki a bind / host változókat a tényleges értékekre
- EXEC
- tényleges végrehajtás egy magyarázó terv alapján
- FETCH (csak SELECT utasítások)
- eredményhalmazt ad vissza egy felhasználónak
hadd magyarázzam el az egyes szakaszokat a következő példában.
végrehajtotta ezt a lekérdezést:
SELECT *FROM employee;
a szerver folyamat létrehoz egy hash a kérdések SQL lekérdezés. A hash egy hexadecimális érték, amelyet az SQL lekérdezés szövege alapján állítanak elő. Itt jön a nagyon fontos rész!! Még a legkisebb változás is (nagybetűtől kisbetűig és fordítva; szóköz hozzáadása/eltávolítása; …) megváltoztatja a hash-ot, ezért kemény elemzést generálhat (bővebben a hard parse vs soft parse alább). Nagyon óvatosnak kell lenned, és csak egy kódhoz kell ragaszkodnod – ezért működnek a legjobban az eljárások (ráadásul többnyire olyan bind változókat használnak, amelyek azonos lekérdezéseket generálnak az Oracle szemében).
az alábbi lekérdezések végrehajtásával könnyen ellenőrizheti saját maga:
-- first run this querySELECT * FROM dual;-- then run this one again with all uppercase lettersSELECT * FROM DUAL;-- check the sql hashes SELECT sql_id, sql_text, hash_valueFROM v$sqlWHERE 1=1AND lower(sql_text) LIKE '%select%from dual%'; sql_id | sql_text | hash_value--------------------------------------------------0x735fvggtnu6 | SELECT * FROM DUAL | 37411111103vyt9wdmca69b | SELECT * FROM dual | 1724193067-- As you can see Oracle evaluated it as two different queries.
a hash létrehozása után az Oracle ellenőrzi, hogy ez a lekérdezés már végrehajtásra került-e ebben az esetben. Hogyan? Annak ellenőrzésével, hogy a hash már létezik-e az SQL területen.
feltételezve, hogy ez a lekérdezés még nem érhető el, létrejön egy SQL terület a lekérdezés hash értékével, és az Oracle elindítja a lekérdezés feldolgozásának első szakaszát, azaz az elemzést.
- a szintaktikai ellenőrzés során az Oracle ellenőrzi a lekérdezést, hogy szintaktikailag helyes-e (SELECT helyett SELECT; a parancsok helyes sorrendje – > SELECT * from table ORDER BY col1 ahol col2 = ‘John’; stb.).
- a következő lépés a szemantikai ellenőrzések, ahol az Oracle ellenőrzi, hogy az oszlopnevek és az objektumnevek helyesek-e. Hogyan? A
- adatszótár-gyorsítótárral történő keresztellenőrzéssel az elemzési szakasz utolsó lépésében az Oracle ellenőrzi, hogy a felhasználó/alkalmazás rendelkezik-e megfelelő engedélyekkel a lekérdezett objektumok eléréséhez.
ha ennek vége, az SQL terület érvényes, és az Oracle OPTIMIZER nevű másik eszköze létrehoz egy végrehajtási tervet – ez azt jelenti, hogy az optimalizáló eldönti, hogyan hajtja végre a lekérdezést. Miután kiválasztotta a legjobb végrehajtási tervet, az Oracle megköti az összes változót, és folytatja a harmadik lépést – a végrehajtást.
mi fog itt történni? Az Oracle beolvassa a lekérdezett objektumokhoz kapcsolódó adatblokkokat, és buffer gyorsítótárba hozza őket (ha még nem mutatják be őket. Ha ott vannak, az Oracle nem fogja újra elolvasni őket!). Ez a folyamat I/O-t generál (ami, amint azt a cikkben említettem számítási architektúra, nagyon lassú a memóriából történő olvasáshoz képest). Itt megállok egy ideig, és hangsúlyozom az I/O generációt. Lágy elemzés esetén az összes adatot a memóriából (puffer gyorsítótár) olvassa le, ami sokkal gyorsabb, mint a lemezről történő olvasás. Ezért kell törekednie a lekérdezések újrahasznosítására/újrafelhasználására, amennyire csak lehetséges. A lekérdezés minden változása új kivonatot generál, ezért valószínűleg I/O-t generál.
most, hogy az adatok már a memóriában vannak (puffer gyorsítótár), a SELECT utasítás feldolgozásra kerül, az utolsó szakasz (FETCH) elindul, és az eredményhalmaz visszakerül a felhasználóhoz.
ha ugyanazt a lekérdezést ismét végrehajtják, a hash generálódik, és mivel a hash SQL területe már létezik, az elemzési szakasz kihagyásra kerül, és csak az EXEC és a FETCH kerül végrehajtásra.