SELECT Statement Processing

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.

  1. elemzés
    • szintaxis ellenőrzés
    • szemantikai ellenőrzés
    • jogosultságok ellenőrzése
  2. BIND
    • cserélje ki a bind / host változókat a tényleges értékekre
  3. EXEC
    • tényleges végrehajtás egy magyarázó terv alapján
  4. 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:

kiválasztás *
alkalmazotttól;
válasszon * alkalmazott;

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:

— először futtassa ezt a lekérdezést
válasszon * – tól dual;
— ezután futtassa újra ezt az összes nagybetűvel
válasszon * – tól DUAL;
— ellenőrizze az sql hash-okat
SELECT sql_id
, sql_text
, hash_érték
V$sql-ből
ahol 1=1
és alacsonyabb (sql_text), mint a’%select%from dual%’;
sql_id / sql_text / hash_value
————————————————–
0x735fvggtnu6 / válasszon * – tól kettős| 3741111110
3vyt9wdmca69b / válasszon * – tól kettős| 1724193067
— mint látható, az Oracle két különböző lekérdezésként értékelte.
— először futtassa ezt a lekérdezéstválassza ki a * – t a dual – ból; — majd futtassa újra ezt az összes nagybetűs betűselect * a DUAL-ból;– ellenőrizze az sql hash SELECT sql_id, sql_text, hash_valueFROM v$sqlWHERE 1=1és alacsonyabb (sql_text), mint a ‘ %select%from dual%’; sql_id | sql_text / hash_value————————————————–0x735fvggtnu6 / SELECT * from DUAL | 37411111103VYT9WDMCA69B / SELECT * FROM dual | 1724193067– mint látható, az Oracle két különböző lekérdezésként értékelte.

-- 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.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.