Sunteți pe pagina 1din 7

ACADEMIA DE STUDII ECONOMICE BUCURETI

FACULTATEA DE CIBERNETIC, STATISTIC I INFORMATIC ECONOMIC

Necesitatea optimizrii cererilor de regsire

Mecanisme de optimizare a cererilor de regsire


Transformri relaionale
orice interogare se poate scrie cu ajutorul expresiilor bazate pe calcul relaional i pe algebra relaional cele dou tipuri sunt echivalente i pot fi oricnd rescrise n cellalt tip se pot realiza prin dou strategii de optimizare: generale: se bazeaz pe proprietile operaiilor din algebra relaional: selecia naintea proieciei selecia naintea jonciunii proiecia naintea jonciunii specifice: depind de SGBDR i in de memorarea datelor, de modul de accesare, precum i de ordonarea expresiilor algebrice

BAZE DE DATE

Optimizarea cererilor de regsire a datelor n bazele de date

Cutarea datelor ntr-o baz de date a reprezentat dintotdeauna o activitate consumatoare de timp i spaiu; Sistemul de gestiune a bazelor de date relaionale (SGBDR) are sarcina de a alege cea mai puin costisitoare metod de execuie a unei cereri de regsire; Costul de execuie este msurat de obicei prin timpul de rspuns, dar i prin resursele fizice implicate n procesul execuiei cererii de regsire a datelor (n termeni de memorie, CPU, operaii de I/O);
minimizarea costului de execuie

Optimizarea alocrii
prin definiie, bazele de date sunt mari consumatoare de spaiu, att n memoria intern, ct i n cea extern pentru folosirea ct mai eficient a acestora, SGBDR folosesc diverse mecanisme: reutilizarea, realocarea, zone de memorie cu destinaie special, comprimarea datelor, alocarea dinamic

Optimizarea accesului
prin definiie, cutarea datelor ntr-o baz de date este o activitate consumatoare de timp, din cauza volumului mare de date stocate i a complexitii SGBDR prezint cele mai bune performane din punctul de vedere al regsirii datelor, datorit limbajelor relaionale implementate SQL

Mecanisme de optimizare a cererilor

optimizarea cererii de regsire a datelor


BUCURETI 2013-2014 2

Strategii de optimizare a cererilor de regsire n SGBD ORACLE

Strategii de optimizare a cererilor de regsire. Recomandri.


1. Se indexeaz coloanele cel mai des folosite n clauza WHERE, pentru acces direct la nregistrrile care dau elemente ale rezultatului

Strategii de optimizare a cererilor de regsire. Recomandri.

SGBD Oracle dispune de un instrument de analiz a timpilor i a algoritmilor de execuie a cererilor Explain Plan; n momentul n care se execut o cerere de regsire, n funcie de anumii factori, Oracle aplic un anumit algoritm, de regul optimizat. Explain Plan indic secvena de pai pe care optimizatorul Oracle i-a ales pentru execuia cererii SQL; Principiul de lucru are la baz costul execuiei acelei cereri aplicnd pe rnd diveri algoritmi de optimizare n funcie de statisticile obinute din dicionarul metadatelor referitoare la: operatorii relaionali, numrul de nregistrri din fiecare tabel implicat, indeci, clustere i partiii disponibile pentru acele tabele implicate n cerere; Sunt luai n calcul i ali factori precum cile de acces la date, ordinea jonciunilor, resursele fizice disponibile (CPU, memorie, operaii de I/O).
4

CREATE INDEX IDX_DESCRIERE ON T_PRODUSE (DESCRIERE); SELECT * FROM T_PRODUSE WHERE DESCRIERE = 'Toner'; nainte:

Dup:

Strategii de optimizare a cererilor de regsire. Recomandri.


2. Se evit folosirea funciilor UPPER sau LOWER asupra coloanelor indexate SELECT * FROM T_PRODUSE WHERE UPPER(DESCRIERE) = 'TONER'; nainte:

Strategii de optimizare a cererilor de regsire. Recomandri.


CREATE INDEX IDX_DESCRIERE_UP ON T_PRODUSE (UPPER(DESCRIERE));

Strategii de optimizare a cererilor de regsire. Recomandri.


3. Se evit folosirea funciei SUBSTR asupra coloanelor indexate SELECT * FROM T_PRODUSE WHERE SUBSTR(DESCRIERE,1,2) = 'To'; nainte:

Dup:

Strategii de optimizare a cererilor de regsire. Recomandri.


SELECT * FROM T_PRODUSE WHERE DESCRIERE like 'To%'; Dup:

Strategii de optimizare a cererilor de regsire. Recomandri.


4. Se recomand folosirea clauzei EXISTS n loc de DISTINCT SELECT DISTINCT P.ID_PRODUS, C.ID_COMANDA FROM T_PRODUSE P, T_COMENZI_DESFACERE C WHERE P.ID_PRODUS=C.ID_PRODUS; nainte:

Strategii de optimizare a cererilor de regsire. Recomandri.


SELECT C.ID_PRODUS, C.ID_COMANDA FROM T_COMENZI_DESFACERE C WHERE EXISTS (SELECT 'x' FROM T_PRODUSE P where P.ID_PRODUS=C.ID_PRODUS); Dup:

10

Strategii de optimizare a cererilor de regsire. Recomandri.


5. Se evit plasarea n clauza HAVING a condiiilor care nu includ funcii de grup nainte: SELECT ID_COMANDA, COUNT(ID_PRODUS) FROM T_COMENZI_DESFACERE GROUP BY ID_COMANDA HAVING ID_COMANDA IN (66,77);

Strategii de optimizare a cererilor de regsire. Recomandri.


Dup: SELECT ID_COMANDA, COUNT(ID_PRODUS) FROM T_COMENZI_DESFACERE WHERE ID_COMANDA IN (66,77) GROUP BY ID_COMANDA;

Strategii de optimizare a cererilor de regsire. Recomandri.


6. Se folosesc grupuri de tabele (clustere) astfel nct tabelele care sunt accesate frecvent mpreun s poat fi stocate fizic n aceleai blocuri de date, cu scopul reducerii numrului de operaii de I/O i implicit pentru a crete performanele nainte: SELECT C.ID_COMANDA, C.STATUS, P.ID_PRODUS FROM T_PRODUSE P, T_COMENZI_DESFACERE C WHERE P.ID_PRODUS=C.ID_PRODUS;

Strategii de optimizare a cererilor de regsire. Recomandri.


CREATE CLUSTER T_CLU (ID_PRODUS NUMBER); CREATE TABLE T_PRODUSEC ( ID_PRODUS NUMBER not null, ID_ORGANIZATIE NUMBER not null, DESCRIERE VARCHAR2(240), CATEGORIE VARCHAR2(333), GRUPA VARCHAR2(47) ) CLUSTER T_CLU(ID_PRODUS); CREATE TABLE T_COMENZI_DESFACEREC ( TIP VARCHAR2(25) not null, VERIFICAT VARCHAR2(25), STATUS VARCHAR2(25), ID_CLIENT NUMBER, ID_COMANDA NUMBER not null, DATA DATE, ID_RAND_COMANDA NUMBER not null, ID_ORGANIZATIE NUMBER, ID_PRODUS NUMBER, CANTITATE_COMANDATA NUMBER, CANTITATE_LIVRATA NUMBER, PRET NUMBER ) CLUSTER T_CLU(ID_PRODUS);
16

Strategii de optimizare a cererilor de regsire. Recomandri.


Dup: SELECT C.ID_COMANDA, C.STATUS, P.ID_PRODUS FROM T_PRODUSEC P, T_COMENZI_DESFACEREC C WHERE P.ID_PRODUS=C.ID_PRODUS;

Strategii de optimizare a cererilor de regsire. Recomandri.


7. Se construiesc indeci asupra funciilor ataate coloanelor (function-based indexes) SELECT C.ID_COMANDA, P.ID_PRODUS, C.CANTITATE_COMANDATA-C.CANTITATE_LIVRATA "REST" FROM T_COMENZI_DESFACERE C, T_PRODUSE P WHERE P.ID_PRODUS=C.ID_PRODUS AND C.CANTITATE_COMANDATA - C.CANTITATE_LIVRATA > 0; nainte:

CREATE INDEX IDX_CLU ON CLUSTER T_CLU;


17 18

Strategii de optimizare a cererilor de regsire. Recomandri.


CREATE INDEX IDX_REST ON T_COMENZI_DESFACERE (CANTITATE_COMANDATA-CANTITATE_LIVRATA);

Strategii de optimizare a cererilor de regsire. Recomandri.


8. Se indexeaz coloanele ale cror valori sunt sortate des

Strategii de optimizare a cererilor de regsire. Recomandri.


CREATE INDEX IDX_CATEG ON T_PRODUSE (CATEGORIE);

Dup:

SELECT * FROM T_PRODUSE ORDER BY CATEGORIE DESC; nainte:

Dup:

20

21

Strategii de optimizare a cererilor de regsire. Recomandri.


9. n funcia COUNT se folosesc ROWID sau coloane indexate

Strategii de optimizare a cererilor de regsire. Recomandri.


Dup: SELECT COUNT(id_produs) FROM T_PRODUSE; sau SELECT COUNT(ROWID) FROM T_PRODUSE;

Strategii de optimizare a cererilor de regsire. Recomandri.


10. Se partiioneaz tabelele de mari dimensiuni n segmente mai mici numite partiii, astfel nct interogrile s le acceseze individual i nu ntreaga tabel din care au provenit nainte: SELECT C.ID_COMANDA, C.STATUS, P.ID_PRODUS FROM T_PRODUSE P, T_COMENZI_DESFACERE C WHERE P.ID_PRODUS=C.ID_PRODUS AND C.CANTITATE_COMANDATA = 2;

nainte: SELECT COUNT(CATEGORIE) FROM T_PRODUSE;

22

23

Strategii de optimizare a cererilor de regsire. Recomandri.


create table T_COMENZI_DESFACERE_P ( TIP VARCHAR2(25) not null, VERIFICAT VARCHAR2(25), STATUS VARCHAR2(25), ID_CLIENT NUMBER, ID_COMANDA NUMBER not null, DATA DATE, ID_RAND_COMANDA NUMBER not null, ID_ORGANIZATIE NUMBER, ID_PRODUS NUMBER, CANTITATE_COMANDATA NUMBER, CANTITATE_LIVRATA NUMBER, PRET NUMBER ) PARTITION BY RANGE (CANTITATE_COMANDATA) (PARTITION CANT_1 VALUES LESS THAN (100) , PARTITION CANT_2 VALUES LESS THAN (1000), PARTITION CANT_3 VALUES LESS THAN (10000));

Strategii de optimizare a cererilor de regsire. Recomandri.

Strategii de optimizare a cererilor de regsire. Recomandri.


11. Se folosesc explicit algoritmi de optimizare a jonciunilor

Dup: Se aleg algoritmii care minimizeaz costul de execuie i implic un minim de resurse; Aceti algoritmi selectai implicit de ctre Oracle pot fi alei explicit i de ctre programator cu ajutorul unor directive inserate n codul SQL; Algoritmii de optimizare utilizai n cazul jonciunilor: FULL TABLE SCANS, INDEX SCANS, NESTED LOOPS, HASH JOINS, SORT MERGE JOINS; Alegerea unui anumit tip de algoritm se face n funcie de statisticile obinute.

25

26

27

Strategii de optimizare a cererilor de regsire n SGBD ORACLE

Strategii de optimizare a cererilor de regsire n SGBD ORACLE


Exemplul urmtor prezint modalitatea de jonciune HASH dintre tabelele CLIENTI i COMENZI_DESFACERE. n acest caz tabela COMENZI_DESFACERE cu 86 de nregistrri este utilizat pe post de tabel hash n memorie, iar tabela CLIENTI avnd 262 de nregistrri va fi scanat
SELECT c.id_client, c.nume_client, cd.data, cd.cantitate_comandata FROM t_clienti c, t_comenzi_desfacere cd WHERE cd.id_produs=454 AND c.id_client=cd.id_client; SELECT /*+ USE_HASH(cd c) */ c.id_client, c.nume_client, cd.data, cd.cantitate_comandata FROM t_clienti c, t_comenzi_desfacere cd WHERE cd.id_produs=454 AND c.id_client=cd.id_client;

Strategii de optimizare a cererilor de regsire n SGBD ORACLE

Algoritmul Hash joins


Algoritmul Nested loop joins


este recomandat pentru jonciuni aplicate ntre subseturi relativ reduse de date; condiia de jonciune reprezint un mod eficient de parcurgere a tabelelor; opiunea de utilizare a algoritmului se specific prin directiva USE_NL

este utilizat pentru cererile n care sunt implicate tabele cu foarte multe nregistrri i asupra crora se aplic o jonciune de egalitate; algoritmul const n alegerea tabelei cu dimensiunea mai mic i construirea unei tabele hash n memorie pe baza condiiei de jonciune; apoi este scanat i cealalt tabel pentru regsirea de nregistrri care corespund condiiei de legtur; acest algoritm este aplicat n cazul n care tabela mai mic ncape n memoria intern, astfel minimizndu-se operaiile de acces pe disc; costul execuiei se rezum la timpul de parcurgere a tabelei de dimensiune mare n cutarea nregistrrilor de jonciune.
28

29

30

Strategii de optimizare a cererilor de regsire n SGBD ORACLE


Exemplul urmtor prezint modalitatea de jonciune NESTED LOOP dintre tabelele CLIENTI i COMENZI_DESFACERE
SELECT c.id_client, c.nume_client, cd.data, cd.cantitate_comandata FROM t_clienti c, t_comenzi_desfacere cd WHERE cd.id_produs=454 AND c.id_client=cd.id_client; SELECT /*+ USE_NL (cd c)*/ c.id_client, c.nume_client, cd.data, cd.cantitate_comandata FROM t_clienti c, t_comenzi_desfacere cd WHERE cd.id_produs=454 AND c.id_client=cd.id_client;
Prin comparaie ntre cele dou metode utilizate, costul de execuie prin Hash Joins este de 11 iar prin Nested Lops de 22, deci n cazul acesta este recomandat utilizarea primei metode
31

Strategii de optimizare a cererilor de regsire n SGBD ORACLE

Strategii de optimizare a cererilor de regsire n SGBD ORACLE


n exemplul urmtor se indexeaz tabelele CLIENTI i COMENZI_DESFACERE
CREATE INDEX clienti_cust_id_idx ON t_clienti(id_client); CREATE INDEX cd_c_id_idx ON t_comenzi_desfacere(id_client); CREATE INDEX cd_ord_date_idx ON t_comenzi_desfacere(data);

Algoritmul Sort merge joins


este recomandat pentru jonciuni n care una dintre tabele are nregistrrile deja sortate; n general, dac este realizat n prealabil o ordonare a nregistrrilor, acest algoritm duce la scderea costurilor de execuie fa de rezultatele similare obinute prin aplicarea algoritmului Hash joins; Sort merge joins este recomandat i pentru cazurile n care se realizeaz o jonciune cu o condiie de inegalitate sau pentru seturi foarte mari de date; principiul de execuie nu este ghidat de alegerea uneia dintre tabele, ci presupune:

Apoi este aplicat jonciunea pe cele dou tabele cu directiva USE_MERGE


SELECT c.id_client, c.nume_client, cd.data, cd.cantitate_comandata FROM t_clienti c, t_comenzi_desfacere cd WHERE cd.id_produs=454 AND c.id_client=cd.id_client; SELECT /*+ USE_MERGE (cd c)*/ c.id_client, c.nume_client, cd.data, cd.cantitate_comandata FROM t_clienti c, t_comenzi_desfacere cd WHERE cd.id_produs=454 AND c.id_client=cd.id_client;

se realizeaz o ordonare a datelor din ambele tabele dup cheia (condiia) de cutare. Dac deja a fost aplicat o sortare corespunztoare, acest pas nu se mai aplic; se realizeaz operaia de jonciune ntre cele dou tabele ordonate.

alegerea acestui algoritm este recomandat pentru seturi mari de date i necesit o ordonare anterioar a datelor.
32 33

Strategii de optimizare a cererilor de regsire n SGBD ORACLE

Strategii de optimizare a cererilor de regsire n SGBD ORACLE


Nested Loop Outer Joins este utilizat n cazul jonciunilor externe iar principiul de lucru este urmtorul: este aleas una dintre tabele pe post de pivot, iar nregistrrile celei de-a doua tabele sunt parcurse ntr-un ciclu repetitiv n funcie de condiia de legtur
SELECT /*+ USE_NL(c cd) */ c.id_client, c.nume_client, NVL(SUM(cd.cantitate_comand ata),0) cantitate_totala FROM t_clienti c, t_comenzi_desfacere cd WHERE c.id_client=cd.id_client(+) group by c.id_client, c.nume_client;

Strategii de optimizare a cererilor de regsire n SGBD ORACLE

Algoritmul Cartesian Joins

se aplic n cazul jonciunilor de tip produs cartezian, atunci cnd ntre cele dou tabele implicate nu se poate realiza o legtur, iar rezultatul cererii const n combinaia fiecrei nregistrri din prima tabel cu fiecare nregistrare din cea de-a doua.

Sort Merge Outer Joins este aplicat cnd nu se poate alege o tabel pe post de pivot sau condiiile impuse datelor duc la o cretere a costurilor obinute prin aplicarea algoritmului Hash i cnd deja nregistrrile sunt ordonate

Hash Join Outer Joins este aplicat n principal pentru volume mari de date astfel nct metoda Hash s fie eficient i dac nu exist posibilitatea utilizrii unei tabele pe post de pivot

Algoritmii Outer Joins

sunt aplicai n cazul jonciunilor externe: Nested Loop Outer Joins, Hash Join Outer Joins, Sort Merge Outer Joins.

34

SELECT /*+ USE_MERGE(c cd) */ c.id_client, c.nume_client, NVL(SUM(cd.cantitate_comand ata),0) cantitate_totala FROM t_clienti c, t_comenzi_desfacere cd WHERE c.id_client=cd.id_client(+) group by c.id_client, c.nume_client;

SELECT /*+ USE_HASH(c cd) */ c.id_client, c.nume_client, NVL(SUM(cd.cantitate_comand ata),0) cantitate_totala FROM t_clienti c, t_comenzi_desfacere cd WHERE c.id_client=cd.id_client(+) group by c.id_client, c.nume_client; 35

36

CURSUL 13...

Protecia bazelor de date Administrarea bazelor de date

S-ar putea să vă placă și