SELECT Statement Processing

jokainen palvelimelle lähettämäsi SQL – kysely on käytävä läpi kolme (neljä-jos kyseessä on SELECT) vaihetta. Ensinnäkin Oracle etsii yhteensopivan SQL-hajautuksen kirjaston välimuistista. Jos hash löytyy se vain noutaa liittyvät selittää suunnitelma ja toteuttaa sen. Jos näin ei ole, vedotaan kovaan jäsennykseen ->, jolloin on suoritettava seuraavat vaiheet.

  1. jäsennys
    • syntaksitarkistus
    • semantiikan tarkistus
    • etuoikeuksien tarkistus
  2. BIND
    • korvaa bind/host-muuttujat todellisilla arvoilla
  3. EXEC
    • selityssuunnitelmaan perustuva toteutuminen
  4. nouda (valitse vain lausekkeet)
    • palauttaa tulosjoukon käyttäjälle

selitän jokaisen vaiheen seuraavassa esimerkissä.

suoritit tämän kyselyn:

valitse *
työntekijältä;
valitse * työntekijältä;

SELECT *FROM employee;

palvelinprosessi luo hajautuksen SQL-kyselylle. Hash on SQL-kyselyn tekstiin perustuva heksadesimaaliarvo. Tässä tulee tärkeä osa!! Pienikin muutos (ylä-pienaakkoset ja päinvastoin; lisäämällä/poistamalla välilyönti; …) muuttaa hash ja siksi se saattaa tuottaa kova jäsennys (enemmän kova jäsennys vs pehmeä jäsennys alla). Sinun täytyy olla hyvin varovainen ja yrittää pitää kiinni vain yhdestä koodista – siksi menettelyt toimivat parhaiten (kaiken kukkuraksi – ne käyttävät enimmäkseen bind-muuttujia, jotka tuottavat samanlaisia kyselyjä Oraclen silmissä).

voit helposti tarkistaa sen itse suorittamalla alla olevat kyselyt:

— aja tämä kysely ensin
valitse * duaalista;
— aja tämä uudestaan isoilla kirjaimilla.
valitse * DUAALISTA;
— tarkista sql-Tiivisteet
valitse sql_id
, sql_text
, hash_arvo
V$sql: stä
jossa 1=1
ja alempi (sql_text) kuten ’ % Valitse % dual%’;
sql_id | sql_text | hash_value
————————————————–
0x735fvggtnu6 / Valitse * DUAL| 3741111110
3vyt9wdmca69b / Valitse * dual| 1724193067
— kuten näette, Oracle arvioi sen kahtena eri kyselynä.
— suorita ensin tämä querySELECT * from dual; – suorita sitten tämä uudelleen kaikilla isoilla kirjaimilla valitse * 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 | 3741111103VYT9WDMCA69B | SELECT * from dual / 1724193067– As you can see Oracle evaluated it as two different queries.

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

kun hash on luotu, Oracle tarkistaa, onko tämä kysely jo suoritettu tässä tapauksessa. Miten? Tarkistamalla, onko hash jo olemassa SQL-alueella.

olettaen, että tämä kysely ei ole vielä saatavilla, luodaan SQL-alue, jolla on tämän kyselyn hash-arvo ja oraakkeli aloittaa kyselyn käsittelyn ensimmäisen vaiheen eli jäsennyksen.

  • syntaksitarkistuksen aikana Oracle tarkistaa kyselyltä, onko se syntaktisesti oikea(valitse Selectin sijaan; komentojen oikea järjestys – > valitse * taulukosta järjestys col1: llä, jossa col2 = ”John”; jne).
  • seuraava vaihe on semantiikkatarkistus, jossa oraakkeli tarkistaa, ovatko sarakkeiden nimet ja objektien nimet oikein. Miten? RISTIINTARKISTAMALLA ne Data Dictionary Cache
  • JÄSENNYSVAIHEEN viimeisessä vaiheessa Oracle tarkistaa, onko käyttäjällä / sovelluksella oikeat oikeudet käyttää kyselytettyjä objekteja.

kun tämä on ohi, SQL – alue on kelvollinen ja toinen Oraclen työkalu nimeltä OPTIMIZER luo suoritussuunnitelman-eli optimoija päättää, miten kysely suoritetaan. Kun paras toteutussuunnitelma on valittu, Oracle sitoo kaikki muuttujat ja etenee kolmanteen vaiheeseen-toteutukseen.

mitä täällä tapahtuu? Oracle lukee tiedusteltuihin kohteisiin liittyviä datalohkoja ja tuo ne puskurivälimuistiin (jos niitä ei vielä esitetä siellä. Jos ne ovat siellä, oraakkeli ei lue niitä enää!). Tämä prosessi tuottaa I / O (joka, kuten mainitsin artikkelissa Computing Architecture, on hyvin hidas verrattuna lukeminen muistista). Pysähdyn tähän hetkeksi ja stressaan I / O-sukupolvea. Pehmeässä jäsennyksessä kaikki tiedot luetaan muistista (puskurivälimuistista), mikä on paljon nopeampaa kuin niiden lukeminen levyltä. Siksi sinun täytyy pyrkiä kierrättämään/uudelleen kyselyt niin paljon kuin mahdollista. Jokainen kyselyn muutos luo uuden hajautuksen ja siten todennäköisesti luo I / o: n.kaikki tämä käsitellään edelleen palvelinprosessissa.

nyt, kun tiedot ovat jo muistissa (puskurivälimuisti), SELECT statement käsitellään ja viimeinen vaihe (nouto) käynnistetään ja tulosjoukko palautetaan takaisin käyttäjälle.

jos sama kysely suoritetaan uudelleen, hajautus luodaan ja koska kyseisen hajautuksen SQL-alue on jo olemassa, JÄSENNYSVAIHE ohitetaan ja suoritetaan vain EXEC ja FETCH.

Vastaa

Sähköpostiosoitettasi ei julkaista.