sfaturi Oracle de Burleson Consulting |
în cadrul acestor două optimizatoare, Oracle oferă mai multe moduri de optimizare. Un mod de optimizare poate fi setat pentru întreaga bază de date sau poate fi setat pentru o anumită sesiune Oracle. Modurile de optimizare includ rule, first_rows, all_rows și choose. Să aruncăm o privire mai atentă la fiecare dintre aceste obiective.
mod regulă
indiciu regulă va ignora CBO și statisticile și de a genera un plan de execuție bazat exclusiv de informații de bază Dicționar de date. Este întotdeauna o idee bună să încercați să reglați o anumită instrucțiune SQL utilizând RBO utilizând un indiciu de regulă sau prin emiterea setului de sesiune alter optimizer_goal=regulă. Cu toate acestea, amintiți-vă întotdeauna că RBO poate alege un index mai puțin decât ideal pentru a deservi o interogare.
Optimizer_mode = alege
modul alege optimizer permite Oracle pentru a alege obiectivul optimizer cel mai potrivit. Acesta este modul implicit de optimizare în cadrul Oracle și, în general, utilizează prezența statisticilor pentru a determina ce optimizator să invoce. Dacă nu există statistici, Oracle va utiliza obiectivul regulii. Dacă există statistici, Oracle va alege first_rows sau all_rows, în funcție de prezența indexurilor și de setarea pentru paralelism și db_file_multiblock_read_count.
avertisment: având statistici incomplete cu modul de optimizare alege Poate provoca încetiniri uriașe. Dacă Oracle detectează un singur tabel într-o interogare cu statistici, va utiliza Optimizatorul bazat pe costuri și va calcula statisticile pentru celelalte tabele în timpul rulării. Acest lucru poate provoca o încetinire uriașă a execuției SQL. Această problemă este foarte frecventă cu începătorii Oracle Remote DBA, deoarece modul implicit este alege, și pentru că DBA-urile de la distanță pentru începători emit uneori selectiv comanda analiză, fără să-și dea seama că efectuează timpi de execuție SQL.
first_rows mode
acesta este un mod de optimizare bazat pe costuri care va returna rândurile cât mai curând posibil, chiar dacă interogarea generală rulează mai mult sau consumă mai multe resurse. Modul de optimizare first_rows implică de obicei alegerea unei scanări Full-index peste o Scanare paralelă full-table. Deoarece modul first_rows favorizează scanările index peste scanările cu masă completă, modul first_rows este cel mai potrivit pentru sistemele online în care utilizatorul final dorește să vadă unele rezultate cât mai repede posibil.
mod all_rows
acesta este un mod de optimizare bazat pe costuri care asigură că timpul total de interogare este minimizat, chiar dacă durează mai mult pentru a primi primul rând. Aceasta implică, de obicei, alegerea unei scanări paralele cu masă completă peste o scanare cu index complet. Deoarece modul all_rows favorizează scanările full-table, modul all_rows este cel mai potrivit pentru interogări orientate pe loturi în care rândurile intermediare nu sunt necesare pentru vizualizare.
care este „mai bine”? Execuție rapidă vs. utilizarea minimă a resurselor.
pentru a înțelege filozofia Oracle privind execuția rapidă și consumul minim de resurse, trebuie să analizăm un exemplu simplu. Pentru a ilustra diferența dintre all_rows și first_rows cu un exemplu supra-simplist, luați în considerare următoarea interogare:
selectați
last_name
din
client
comandă prin
last_name;
această interogare poate fi deservită în două moduri:
-
Scanare completă a tabelului – aici efectuăm o Scanare completă a tabelului în paralel și sortăm rândurile în spațiul tablespace TEMP. Din motive de ilustrare, să presupunem că acest plan de execuție produce cel mai rapid Timp total de execuție și utilizarea minimă a resurselor (Figura 2).
Figura 2: Efectuați o Scanare completă a tabelului și o sortare (all_rows)
-
Full Index scan – aici vom prelua rândurile în ordine last_name utilizând un last_name_index. Această tehnică are ca rezultat mai multe citiri fizice, dar începe să returneze rânduri sortate aproape imediat (Figura 3).
Figura 3: Efectuați o recuperare a indexului(first_rows)
din nou, presupunând că acceptăm scanarea tabelului complet și sortarea este mai puțin intensă I/O decât scanarea indexului complet, atunci putem vedea clar diferența dintre obiectivele optimizatorului. Scanarea Full-index va începe să returneze rânduri aproape imediat în detrimentul I/O suplimentar, în timp ce scanarea full-table va necesita mai puține resurse, dar setul de rezultate nu va fi disponibil până la sfârșitul interogării.
acesta este un fragment din „Oracle de înaltă performanță SQL Tuning” de Donald K. Burleson, publicat de Oracle Press.