You are on page 1of 14

SQL TUNING METODE DE OPTIMIZARE A JONCIUNILOR

1. NOIUNI FUNDAMENTALE

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 (querry), n
funcie de anumii factori, SGBD Oracle aplic un anumit algoritm, de regul optimizat.
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 join-urilor, resursele fizice disponibile (CPU, memorie, operaii de I/O).
Este ales acel algoritm care minimizeaz costul de execuie i implic un minim de resurse.
Aceti algoritmi selectai implicit de ctre SGBD Oracle pot fi alei i de ctre programator cu
ajutorul unor directive sau indicii (hints) adugate n cererea SQL astfel nct s se seteze
parametrul OPTIMIZER_MODE pentru o anumit cerere.
Pentru a putea determina ce algoritm va mbunti performanele cererilor se utilizeaz
pachetul

DBMS_STATS

prin

care

se

colecteaz

statistici

referitoare

la

indeci/tabele/schema/ntreaga baz de date. Pachetul DBMS_STATS care are urmtoarele


proceduri
- GATHER_INDEX_STATS;
- GATHER_TABLE_STATS;
- GATHER_SCHEMA_STATS;
- GATHER_DATABASE_STATS.
Rezultatele furnizate de funciile pachetului se refer la distribuia datelor, numrul de
nregistrri, unicitatea valorilor, duplicate, etc, rezultate pe baza crora se poate aplica un plan de
execuie selectnd un anumit algoritm.
Pentru exemplificare vom utiliza un set de tabele rezultate activitatea comercial,
respectiv:

T_CLIENTI,

T_COMENZI_DESFACERE,

T_FURNIZORI,

T_PRODUSE,

T_COMENZI_APROVIZIONARE

MS_DBA/oracle).

(sunt

T_UNITATI,
n

schema

SQL TUNING METODE DE OPTIMIZARE A JONCIUNILOR

V conectai n SQL Developer cu utilizatorul propriu.


Pentru conexiunea in SQL Developer folositi urmatoarele detalii in fereastra New database
Connection (click dr pe Connection-> New Connection):
Connection Name: numele Dvs
Username: DBA1_NUME sau BDA1_NUME
Parola: stud
Server
Masina virtuala
Host: 37.120.250.20
Host: xpone
Port 1521
Port: 1521
Service_name: oracle
Service_name: orcl
Daca nu aveti un utilizator, v conectati cu ms_dba/oracle si v creai un utilizator.
CREATE USER DBA1_NUME IDENTIFIED BY ORACLE;
GRANT CONNECT, RESOURCE, CREATE VIEW TO DBA1_NUME;
Pentru a crea tabelele n schema proprie putei s utilizai comenzile:
create table T_Clienti as select * from ms_dba.T_clienti;
2

SQL TUNING METODE DE OPTIMIZARE A JONCIUNILOR


create table T_comenzi_desfacere as select * from ms_dba.t_comenzi_desfacere;
Colectm informaii despre tabelele din schema curent cu ajutorul funciei
GATHER_TABLE_STATS(USER, TABELA):
Begin
DBMS_STATS.GATHER_TABLE_STATS (user, 'T_COMENZI_DESFACERE');
DBMS_STATS.GATHER_TABLE_STATS (user, 'T_CLIENTI');
End;
/
sau
EXECUTE DBMS_STATS.GATHER_TABLE_STATS (user, 'T_COMENZI_DESFACERE');
EXECUTE DBMS_STATS.GATHER_TABLE_STATS (user, 'T_CLIENTI');
2. ALGORITMI UTILIZAI N PROCESAREA INTEROGRILOR CU
JONCIUNI
Alegerea unui anumit tip de algortim se face n funcie de statisticile obinute.
2.1. Algoritmul Hash joins - este utilizat pentru cererile n care sunt implicate tabele cu
foarte multe registrri 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.
Exemplul urmtor prezint modalitatea de jonciune HASH dintre tabelele T_CLIENTI i
T_COMENZI_DESFACERE. n acest caz tabela T_CLIENTI cu 76 de nregistrri este ncrcat
n memorie, iar tabela T_COMENZI_DESFACERE avnd 1429 de nregistrri va fi scanat:
select
c.ID_CLIENT,
c.NUME_CLIENT,
cd.DATA,
3

SQL TUNING METODE DE OPTIMIZARE A JONCIUNILOR


cd.CANTITATE_COMANDATA
from T_clienti c,
t_comenzi_desfacere cd
where c.ID_CLIENT=cd.ID_CLIENT;
Pentru vizualizarea planului de execuie n SQL Developer se apas tasta F10 sau se
alege opiunea Explain Plan.

Fig. 2.2. Jonciune de tipul HASH


In acest caz, implicit este aplicat algoritmul HASH, ns dac se aplic un alt algoritm se poate
seta parametrul de optimizare cu ajutrul directivei /*+ USE_HASH(tabela1 tabela2) */:
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 c.ID_CLIENT=cd.ID_CLIENT; Cost 11
select /*+ USE_NL(cd c) */
4

SQL TUNING METODE DE OPTIMIZARE A JONCIUNILOR


c.ID_CLIENT,
c.NUME_CLIENT,
cd.DATA,
cd.CANTITATE_COMANDATA
from T_CLIENTI c,
T_comenzi_desfacere cd
where c.ID_CLIENT=cd.ID_CLIENT; Cost 378
Exerciiul 1:
a) Creai tabelele T_FURNIZORI i T_COMENZI_APROVIZIONARE pe baza
tabelelor din schema MS_DBA;
b) Colectai statistici referitoare la aceste tabele;
c) Creai o interogare pe baza acestor tabele prin care s afiai numele furnizorilor, data
comenzilor ncheiate i suma total (sum(c.cantitate_primita*c.pret_unitar));
d) Afiai planul de execuie. Ce metod este aleas n mod implicit?
2.2. Algoritmul Nested loop joins este recomandat pentru jonciuni ntre subseturi
relativ reduse de date, iar condiia de jonciune reprezint un mod eficient de parcurgere a
tabelelor. Opiunea de utilizare a algoritmului se specific prin directiva USE_NL:

SQL TUNING METODE DE OPTIMIZARE A JONCIUNILOR


Fig 2.3: Nested Loops
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 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 378, deci n cazul acesta este recomandat utilizarea primei
metode.
Exerciiul 2:
a) Pe baza tabelelor T_FURNIZORI i T_COMENZI_APROVIZIONARE, modificai
interogarea de la exerciiul 1 astfel nct s fie afiate doar comenzile furnizorului 'LA
FANTANA';
b) Observai planul de execuie. Implicit este utilizat algoritmul HASH JOINS.
c) Modificai planul prin directiva de execuie astfel nct s fie utilizat algoritmul
NESTED LOOPS. Observai costul de execuie.
3. Algoritmul Sort merge joins este recomandat pentru jonciuni n care una dintre
tabele are nregistrrile deja sortate. In general dac este aplicat n prelabil o ordonare a
negistrrilor, 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 ncare se realizeaz o jonciune cu o condiie de inegalitate sau pentru seturi foarte mari
de date. Principiul de execuie nu este ghidat de alegerea unei tabele sau alta, ci este urmtorul:
- 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 pentru condiii
de inegalitate ntre tabele deoarece acest tip de jonciune necesit i o ordonare a datelor.

SQL TUNING METODE DE OPTIMIZARE A JONCIUNILOR


n exemplul urmtor se indexeaz tabela T_CLIENTI pe coloana ID_CLIENT, iar tabela
T_COMENZI_DESFACERE pe coloana ID_CLIENT.
create index clienti_cust_id_idx on t_clienti(ID_CLIENT);
create index cd_c_id_idx on T_comenzi_desfacere(ID_CLIENT);
Apoi este aplicat jonciunea pe cele dou tabele cu directiva USE_MERGE:
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 c.ID_CLIENT=cd.ID_CLIENT;

Fig 2.4: Sort Merge joins


Exerciiul 3:
a) Pe tabela T_FURNIZORI creai un index pe coloana id_furnizor (denumit
idx_id_furnizor);
7

SQL TUNING METODE DE OPTIMIZARE A JONCIUNILOR


b) Pe tabela T_COMENZI_APROVIZIONARE creai un index pe coloana id_furnizor
(denumit idx_id_furnizor_comenzi);
c) Rulai interogarea de la exerciiul 2 i observai planul de execuie.
d) Modificai planul de execuie astfel nct s se utilizeze algoritmul SORT MERGE JOIN;
e) Eliminai condiia de selecie pe numele furnizorului. Observai planul de execuie.
Comparai costul obinut cu cel din cazul algoritmului Nested Loops.
2.4. Algoritmul Cartesian joins - se aplic n cazul jonciunilor de tip produs cartezian cand
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.
2.5. Algortimii Outer Joins - sunt aplicai n cazul jonciunilor externe i sunt de patru tipuri:
Nested Loop Outer Joins, Hash Join Outer Joins, Sort Merge Outer Joins, Full Outer Joins.

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. n
exemplul urmtor aplicarea acestui algortim duce la obinerea celui mai mare cost de
execuie:
SELECT /*+ USE_NL(c cd) */
c.ID_CLIENT,
c.NUME_CLIENT,
nvl(sum(cd.CANTITATE_COMANDATA),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;
Dac ns introducem o condiie suplimentar de limitare a valorilor cmpului
ID_CLIENT vom obine o mbuntire a performanelor:
SELECT /*+ USE_NL(c cd) */
c.ID_CLIENT,
c.NUME_CLIENT,
8

SQL TUNING METODE DE OPTIMIZARE A JONCIUNILOR


nvl(sum(cd.CANTITATE_COMANDATA),0) total_quantity
FROM T_CLIENTI c,
T_comenzi_desfacere cd
WHERE c.ID_CLIENT = cd.ID_CLIENT(+)
and c.ID_CLIENT IN(18137, 372)
group by c.ID_CLIENT,
c.NUME_CLIENT;

Hash Join Outer Joins este aplicat n principal pentru volume mari de date astfel nct
metoda Hash fie eficient i nu exist posibilitatea utilizrii unei tabele pe post de pivot.
n exemplul urmtor se obine cel mai bun rezultat prin aplicarea acestui algrtim:
SELECT /*+ USE_HASH(c cd) */
c.ID_CLIENT,
c.NUME_CLIENT,
nvl(sum(cd.CANTITATE_COMANDATA),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;

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 sau cnd deja nregistrrile sunt ordonate:
SELECT /*+ USE_MERGE(c cd) */
c.ID_CLIENT,
c.NUME_CLIENT,
nvl(sum(cd.CANTITATE_COMANDATA),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;
9

SQL TUNING METODE DE OPTIMIZARE A JONCIUNILOR

Full Outer Joins Este utilizat ca o extensie a jonciunilor la dreapta i la stnga (left
joins i right joins). Se aplic dup ce se realizeaz o jonciune intern i se adaug toate
negistrrile neselectate din ambele tabele inclusiv valorile null.

SELECT a.id_departament, denumire_departament, nume, salariul


FROM angajati a FULL OUTER JOIN departamente d
ON a.id_departament = d.id_departament;

--HASH JOIN - implicit


select denumire_produs, data, pret, cantitate
from comenzi c, produse p, rand_comenzi r
where c.nr_comanda = r.nr_comanda and p.id_produs = r.id_produs; Cost 12

10

SQL TUNING METODE DE OPTIMIZARE A JONCIUNILOR

--NESTED LOOP impus


select /*+USE_NL(c p r)*/denumire_produs, data, pret, cantitate
from comenzi c, produse p, rand_comenzi r
where c.nr_comanda = r.nr_comanda and p.id_produs = r.id_produs; Cost 807

11

SQL TUNING METODE DE OPTIMIZARE A JONCIUNILOR


--NESTED LOOP implicit
select denumire_produs, data, pret, cantitate
from comenzi c, produse p, rand_comenzi r
where c.nr_comanda = r.nr_comanda and p.id_produs = r.id_produs
and p.id_produs = 2400; Cost 4

--HASH JOIN impus


select /*+USE_HASH(c p r)*/ denumire_produs, data, pret, cantitate
from comenzi c, produse p, rand_comenzi r
where c.nr_comanda = r.nr_comanda and p.id_produs = r.id_produs
and p.id_produs = 2400; Cost 7

12

SQL TUNING METODE DE OPTIMIZARE A JONCIUNILOR

--SORT MERGE JOIN - impus


select /*+USE_MERGE(c p r)*/ denumire_produs, data, pret, cantitate
from comenzi c, pr
oduse p, rand_comenzi r
where c.nr_comanda = r.nr_comanda and p.id_produs = r.id_produs;

13

SQL TUNING METODE DE OPTIMIZARE A JONCIUNILOR

14

You might also like