Kyselyn käsittelyn osien tunnistaminen
Kyselyn suorittamisessa on neljä erillistä vaihetta. Suoritusjärjestyksessä nämä vaiheet ovat seuraavat:
- Jäsentäminen
- Muunnos (uudelleenkirjoittaja)
- Suunnittelu
- Suoritus
Jäsennin
Jäsennyksen vastuulla on tarkistaa kelvollisen syntaksin kyselymerkkijono. Jäsennys sisältää kaksi pääosaa:
- gram.y , joka koostuu kielioppisääntöjen ja vastaavien toimintojen joukosta.
- scan.1 eli sanasto, joka tunnistaa tunnisteet ja SQL:n avainsanat. Jokainen avainsana tai tunniste käynnistää tunnuksen, joka luodaan ja luovutetaan jäsennykseen.
Jäsennys luo kyselypuun, joka erottaa kyselyn tunnistettaviin osiin, jotta voidaan ymmärtää, mitkä taulukot liittyvät ja mitä suodattimia on käytetty ja niin edelleen. Kyselypuun osat ovat seuraavat:
- Komentotyyppi – VALITSE, LISÄÄ, PÄIVITÄ tai POISTA.
-
Aluetaulukon merkintä (RTE) – luettelo suhteista,
ietaulukoista, alikyselyistä, liitosten tuloksista jne. SELECT-lausekkeessa nämä kohteet näkyvät FROM-avainsanan jälkeen. - Tulossuhde – komentojen LISÄÄ, PÄIVITÄ ja POISTA tulossuhde on taulukko tai näkymä, jossa muutokset tulevat voimaan.
- Kohdeluettelo – kyselyn tulokset, jotka on tunnistettu avainsanojen SELECT ja FROM välillä. DELETE-komennot eivät tuota tulosta, joten suunnittelija lisää erityisen merkinnän, jotta suoritettava tiedosto voi löytää rivin, joka poistetaan. LISÄÄ-komennot tunnistavat uudet rivit, joiden tulee siirtyä tulossuhteeseen. UPDATE-komentojen kohdeluettelossa kuvataan uudet rivit, joiden pitäisi korvata vanhat.
- Karsinta – totuusarvo, joka määrittää, suoritetaanko lopullisen tuloksen rivin toiminto. Se vastaa SQL-lausekkeen WHERE-lausetta.
- Liitospuu – tämä puu voi olla luettelo FROM-kohteista. Liitokset voidaan tehdä missä tahansa järjestyksessä tai tietyssä järjestyksessä, kuten ulkoliitosten kohdalla.
- Muut – kohteet, joilla ei ole tässä vaiheessa merkitystä, kuten ORDER BY -lause.
Uudelleenkirjoittava
Jäsennyksen tulos siirretään muunnos- tai uudelleenkirjoittajien prosessiin, ellei löydetä virhettä, jolloin palautetaan virhesanoma.
Kyselyn uudelleenkirjoittaja kirjoittaa kyselyn tekstin uudelleen käyttämällä siihen sääntöjä . Uudelleenkirjoittaja ottaa huomioon säännöt ja välittää muokatun kyselyn kyselysuunnittelijalle. Rivitason suojaus otetaan käyttöön tässä vaiheessa.
Esimerkiksi SELECT-sääntöjä sovelletaan aina viimeisenä vaiheena, mukaan lukien LISÄÄ-, PÄIVITÄ- ja POISTA-kyselyt. Säännöt tarkoittavat myös sitä, että UPDATE-kyselyt eivät korvaa olemassa olevia rivejä, vaan sen sijaan lisätään uusi rivi, ja vanha rivi on piilotettu. Kun tapahtuma on toteutettu, tyhjiöprosessi voi poistaa piilotetun rivin.
Planner
Suunnittelijan tehtävänä on noudattaa kyselyn sääntöjä ja ymmärtää, mitkä eri tavat, joilla kysely voidaan suorittaa, ovat nopeimpia.
Suunnittelija luo suunnitelmapuun, jonka solmut edustavat tietojen fyysisiä toimintoja.
PostgreSQL käyttää kustannuspohjaista kyselyoptimointitoimintoa optimaalisen suunnitelman löytämiseksi kyselylle. Suunnittelija arvioi erilaisia suoritussuunnitelmia ja arvioi, kuinka paljon tarvittavia resursseja tarvitaan, kuten suoritinjaksoja, I/O-toimintoja jne. Tämä arvio muunnetaan sitten yksiköiksi, joita kutsutaan suunnitelmakustannuksiksi. Palvelupaketti, jossa on pienin hinta, valitaan.
Kun liitosten määrä kuitenkin kasvaa, mahdollisten suunnitelmien määrä kasvaa eksponentiaalisesti. Jokaisen mahdollisen suunnitelman arvioimisesta tulee mahdotonta myös suhteellisen yksinkertaisissa kyselyissä. Heuristiikkoja ja algoritmeja käytetään rajoittamaan suunnitelmien määrää. Tuloksena on, että valittu suunnitelma ei ehkä ole optimaalinen suunnitelma. Se on kuitenkin lähes optimaalinen, ja se valitaan kohtuullisessa ajassa.
Kustannukset ovat suunnittelijan paras arvio. Kustannusarvion tarkoituksena on vertaillasaman kyselyn eri suoritussuunnitelmia samoissa olosuhteissa. Suunnittelija käyttää taulukoista ja riveistä kerättyjä tilastotietoja kustannusarvioiden tuottamiseksi kyselyille. Jotta kustannusarviot olisivat oikein, tilastojen on oltava ajan tasalla.
Ajan tasalla koskevat tilastotiedot
Kyselyoptimoinnin planner-osa käyttää taulukoita ja rivejä koskevia tilastotietoja tarkkojen kustannusarvioiden tuottamiseksi.
ANALYZE kerää tilastotietoja tietokantataulukoista ja tallentaa tulokset pg_statistic järjestelmäluetteloon. Sinun on suoritettava ANALYSOI, jos:
- Poistit käytöstä autovacuumin (joka tavallisesti analysoi taulukot automaattisesti)
- Olet poistanut autovacuum-toiminnon käytöstä, etkä ole suorittanut ANALYZE-toiminnolla viime aikoina
- Jompikumpi edellisistä lausekkeista sisältää useita INSERTS-, UPDATES- tai DELETE-lausekkeita.
Kustannusarviot perustuvat up-to-päivämäärätilastoihin, ja jos tilastot ovat vanhentuneita ja tehoton suunnitelma voidaan valita. Kun parametria ei välitetään ANALYZE-toiminnolle, tietokannan jokainen taulukko tarkastetaan.
ANALYZE-syntaksi on seuraava:
ANALYZE [ VERBOSE ] [ ***table*** [ ( ***column*** [, ...] ) ] ]
VERBOSE näyttää edistymisviestit, joista näkyy, mitä taulukkoa analysoidaan, yhdessä joidenkin tilastotietojen kanssa.
Ajoita VACUUM ja ANALYZE suoritettavaksi päivittäin vähäkäyttöisenä aikana. ANALYZE-toimintoa voidaan suorittaa rinnakkain muiden toimintojen kanssa, koska se edellyttää vain lukulukkoa kohdetaulukosta.
Pesänjakaja
Tässä vaiheessa otetaan suunnittelijan luoma suunnitelma ja käsitellään sitä rekursiivisesti vaaditun rivijoukon poimimiseksi. Aina, kun palvelupaketin solmua kutsutaan, suoritettavan kohteen on annettava rivi tai raportti takaisin, jotta se on valmis.
Suoritettava suoritustoiminto arvioi kaikki neljä SQL-kyselytyyppiä:
- SELECT-lauseke
- INSERT
- UPDATE
- POISTAA
SELECT-funktiota varten suoritettava tiedosto palauttaa kunkin rivin takaisin asiakkaalle tulosjoukkona.
KUKIN palautettu rivi lisätään MÄÄRITETTYyn taulukkoon LISÄÄ-parametria varten. Tämä tehtävä tehdään erityisessä ylimmän tason suunnitelmasolmussa, jonka nimi on ModifyTable.
UPDATE-funktiota varten kukin laskettu rivi sisältää kaikki päivitetyt sarakearvot sekä kohderivin rivitunnuksen. Tiedot lähetetään ModifyTable-solmuun, joka luo päivitetyn rivin ja merkitsee vanhan rivin poistetuksi.
DELETE-funktiota varten ainoa sarake, jonka suunnitelma palauttaa, on rivitunnus. ModifyTable-solmu käyttää rivitunnusta rivin merkitsemiseen poistetuksi.