Identificați componentele de procesare a interogării

Finalizat

Există patru etape separate pentru executarea interogării. În ordinea executării, aceste etape sunt:

  1. Parsarea
  2. Transformare (Reswriter)
  3. Planificare
  4. Execuție

Interpretorul

Interpretorul este responsabil pentru verificarea șirului de interogare pentru sintaxă validă. Interpretorul are două părți principale:

  • gram.y care este alcătuit dintr-un set de reguli gramaticale și acțiuni corespunzătoare.
  • scan.1lexer, care recunoaște identificatorii și cuvintele cheie SQL. Fiecare cuvânt cheie sau identificator declanșează crearea și mânuirea unui simbol către interpretor.

Interpretorul construiește un arbore de interogare, care separă interogarea în părți identificabile pentru a înțelege ce tabele sunt implicate, ce filtre au fost aplicate etc. Părțile unui arbore de interogare sunt:

  • Tip comandă - SELECT, INSERT, UPDATE sau DELETE.
  • intrare tabel interval (RTE) - o listă de relații, tabele ie, subcheiri, rezultate de asocieri etc. Într-o instrucțiune SELECT, aceste elemente apar după cuvântul cheie FROM.
  • Relația rezultat - relația rezultat pentru comenzile INSERT, UPDATE și DELETE, este tabelul sau vizualizarea în care vor avea efect modificările.
  • lista țintă - rezultatele interogării, identificate între cuvintele cheie SELECT și FROM. Comenzile DELETE nu produc un rezultat, prin urmare, planificatorul adaugă o intrare specială pentru a permite executorului să găsească rândul de șters. Comenzile INSERT identifică noile rânduri care ar trebui să intre în relația rezultat. Pentru comenziLE UPDATE, lista țintă descrie noile rânduri care ar trebui să înlocuiască cele vechi.
  • Calificare - o valoare booleană care specifică dacă operațiunea pentru rândul rezultat final trebuie executată sau nu. Acesta corespunde clauzei WHERE a unei instrucțiuni SQL.
  • uniți arborele - acest arbore poate fi o listă de elemente FROM. Unirile se pot efectua în orice ordine sau se pot efectua într-o anumită ordine, cum ar fi unirile exterioare.
  • Altele - elemente care nu sunt relevante în această etapă, cum ar fi clauza ORDER BY.

Rewriter

Rezultatul interpretorului este transmis procesului de transformare sau rescri ere, cu excepția cazului în care se găsește o eroare în cazul în care se returnează un mesaj de eroare.

Rescrie din nou textul interogării, aplicând reguli de la aceasta. Reswriter ia în considerare regulile, apoi trece interogarea modificată la planificatorul de interogare. Securitatea la nivel de rând este implementată în această etapă.

De exemplu, regulile pentru SELECT se aplică întotdeauna ca ultimul pas, inclusiv pentru interogările INSERT, UPDATE și DELETE. Regulile înseamnă, de asemenea, că interogările UPDATE nu suprascriu rândurile existente, în schimb se inserează un rând nou, iar rândul vechi este ascuns. După comiterea tranzacției, procesul de vid poate elimina rândul ascuns.

Planificator

Activitatea planificatorului este să preia regulile de interogare și să înțeleagă care dintre modurile diferite în care poate fi executată interogarea este cea mai rapidă.

Planificatorul creează un arbore de plan, cu noduri care reprezintă operațiuni fizice în date.

PostgreSQL utilizează un optimizator de interogare bazat pe costuri pentru a găsi planul optim pentru o interogare. Planificatorul evaluează diverse planuri de executare și estimează cât din resursele necesare sunt necesare, cum ar fi cicluri de CPU, operațiuni I/O etc. Această estimare este apoi convertită în unități, cunoscută ca de cost al planului de. Planul cu cel mai mic cost este selectat.

Totuși, pe măsură ce numărul de asocieri crește, numărul de planuri posibile crește exponențial. Evaluarea fiecărui plan posibil devine imposibilă chiar și pentru interogări relativ simple. Heuristici și algoritmi sunt utilizați pentru a limita numărul de planuri posibile. Rezultatul este că planul selectat poate să nu fie planul optim. Cu toate acestea, este aproape optim și selectat într-un timp rezonabil.

Costul este cea mai bună estimare a planificatorului. Scopul estimării costurilor este de a compara planuri de executare diferite pentru interogarea aceeași în condițiile de aceleași. Planificatorul utilizează statistici colectate în tabele și rânduri pentru a produce estimări de cost pentru interogări. Pentru ca estimările de cost să fie corecte, statisticile trebuie să fie actualizate.

Statistici actualizate

Componenta planificator a optimizatorului de interogări utilizează statistici despre tabele și rânduri pentru a produce estimări exacte ale costurilor.

ANALYZE colectează statistici despre tabelele bazei de date și stochează rezultatele în catalogul de sistem pg_statistic. Trebuie să rulați ANALIZA, dacă:

  • Ați dezactivat autovacuum (care analizează automat tabelele)
  • Ați dezactivat autovacuum și nu ați rulat recent ANALYZE
  • Oricare dintre instrucțiunile anterioare și există multe instrucțiuni INSERTS, UPDATES sau DELETE.

Estimările de cost se bazează pe statisticile up-to-date, iar dacă statisticile sunt depășite și s-ar putea alege un plan ineficient. Când nu se transmite niciun parametru pentru ANALIZA, se examinează fiecare tabel din baza de date.

Sintaxa pentru ANALYZE este:

ANALYZE [ VERBOSE ] [ ***table*** [ ( ***column*** [, ...] ) ] ]

VERBOSE afișează mesajele de progres pentru a afișa ce tabel este analizat, împreună cu unele statistici.

Planificați VID și ANALIZĂ pentru a rula zilnic în timpul unui timp redus de utilizare. ANALYZE poate rula în paralel cu alte activități, deoarece necesită doar o blocare în citire a tabelului țintă.

Executor

Această fază preia planul creat de planificator și îl procesează recursiv pentru a extrage setul necesar de rânduri. De fiecare dată când se numește nod de plan, executorul trebuie să livreze un rând sau să raporteze înapoi pentru a spune că s-a terminat.

Executorul evaluează toate cele patru tipuri de interogare SQL:

  • ALEGE
  • INSERA
  • ACTUALIZA
  • ȘTERGE

Pentru SELECT, executorul returnează fiecare rând înapoi clientului ca set de rezultate.

Pentru INSERT, fiecare rând returnat este inserat în tabelul specificat. Această activitate se efectuează într-un nod special de plan de nivel superior numit ModifyTable.

Pentru UPDATE, fiecare rând calculat include toate valorile de coloană actualizate, plus ID-ul de rând al rândului țintă. Datele sunt trimise la un nod ModifyTable, care creează un rând actualizat și marchează rândul vechi ca șters.

Pentru DELETE, singura coloană returnată de plan este ID-ul rândului. Nodul ModifyTable utilizează ID-ul de rând pentru a marca rândul ca șters.