practică sgbdvcosmin/pagini/resurse... · volumul de date •răspunsul unei interogări depinde...
TRANSCRIPT
![Page 1: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/1.jpg)
Practică SGBD
1
![Page 2: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/2.jpg)
http://use-the-index-luke.com/
2
![Page 3: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/3.jpg)
Performanța - Volumul de date
3
![Page 4: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/4.jpg)
Volumul de date
• O interogare devine mai lentă cu cât sunt maimulte date în baza de date
• Cât de mare este impactul asupraperformanței dacă volumul datelor se dublează ?
• Cum putem îmbunătăți ?
4
![Page 5: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/5.jpg)
Volumul de date
• Interogarea analizată:
SELECT count(*) FROM scale_data
WHERE section = ? AND id2 = ?
• Section are rolul de a controla volumul de date. Cu cât este mai mare section, cu atât este mai mare volumul de date returnat.
• Considerăm doi indecși: index1 și index2
5
![Page 6: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/6.jpg)
Volumul de date
• Interogarea analizată:
SELECT count(*) FROM scale_data
WHERE section = ? AND id2 = ?
• Section mic – index1 și apoi index2
6
![Page 7: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/7.jpg)
Volumul de date
• Scalabilitatea indică dependența performanțeiîn funcție de factori precum volumul de
informații.
7
![Page 8: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/8.jpg)
Volumul de date
• index1 – timp dublu față de cel inițial
• index2 – trimp x20 față de cel inițial
8
![Page 9: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/9.jpg)
Volumul de date
• Răspunsul unei interogări depinde de maimulți factori. Volumul de date e unul dintre ei.
• Dacă o interogare merge bine în faza de test, nu e neapărat ca ea să funcționeze bine și în producție.
• Care este motivul pentru care apare diferența dintre index1 și index2 ?
9
![Page 10: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/10.jpg)
Ambele par identice ca execuție:
10
![Page 11: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/11.jpg)
Volumul de date
• Ce influențează un index ?
table acces
scanarea unui interval mare
• Nici unul din planuri nu indică acces pe bazaindexului (TABLE ACCES BY INDEX ROW ID)
• Unul din intervale este mai mare atunci cand e parcurs…. trebuie să avem acces la “predicate
information” ca să vedem de ce:
11
![Page 12: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/12.jpg)
12
![Page 13: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/13.jpg)
13
![Page 14: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/14.jpg)
Volumul de date
• Puteți spune cum a fost construit indexulavând planurile de execuție ?
14
![Page 15: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/15.jpg)
Volumul de date
• Puteți spune cum a fost construit indexulavând planurile de execuție ?
• CREATE INDEX scale_slow ON
scale_data (section, id1, id2);
• CREATE INDEX scale_fast ON
scale_data (section, id2, id1);
Campul id1 este adaugat doar pentru a pastraaceeasi dimensiune (sa nu se creada ca indexulscale_fast e mai rapid pentru ca are mai putinecampuri in el). 15
![Page 16: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/16.jpg)
Încărcarea sistemului
• Faptul ca am definit un index pe care îl considerăm bun pentru interogările noastrenu îl face să fie neapărat folosit de QO.
• SQL Server Management Studio Arata predicatul
doar ca un tooltip
16
![Page 17: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/17.jpg)
Încărcarea sistemului
• De regulă, împreună cu numărul de înregistrări, crește și numărul de accesări.
• Numărul de accesari este alt parametru ceintră în calculul scalabilității.
17
![Page 18: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/18.jpg)
Încărcarea sistemului
• Dacă inițial era doar o singură accesare, considerând același scenariu dar cu 1-25 interogări concurente, timpul de raspunscrește:
18
![Page 19: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/19.jpg)
Încărcarea sistemului
• Asta înseamnă că și dacă avem toata baza de date din producție și testăm totul pe ea, tot sunt șanse ca în realitate, din cauza număruluimare de interogări, să meargă mult mai greu.
• Notă: atenția dată planului de execuție estemai importantă decât benchamarkuri
superficiale ( gen SQL Server Management Studio).
19
![Page 20: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/20.jpg)
Încărcarea sistemului
• Ne-am putea aștepta ca hardwareul mai puternicdin producție să ducă mai bine sistemul. În fapt, în faza de development nu există deloc latență –ceea ce nu se întâmplă în producție (unde accesulpoate fi întârziat din cauza rețelei).
• http://blog.fatalmind.com/2009/12/22/latency-security-vs-performance/
• http://jamesgolick.com/2010/10/27/we-are-experiencing-too-much-load-lets-add-a-new-server..html
20
![Page 21: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/21.jpg)
Timpi de răspuns + throughput
• Hardware mai performant nu este mai rapid doar poate duce mai multa încărcare.highway (daca
adaug 10 benzi, nu inseamna ca si masinile vor merge de 10 ori mai rapid)
• Procesoarele single-core vs procesoarelemulti-core (când e vorba de un singur task).
• Scalarea pe orizontală (adăugarea de procesoare) are același efect.
• Pentru a îmbunătăți timpul de răspuns estenecesar un arbore eficient (chiar și în NoSQL).
21
![Page 22: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/22.jpg)
Timpi de răspuns
• Indexarea corectă fac căutarea într-un B-tree în timp logaritmic.
• Sistemele bazate pe NoSQL par să fi rezolvatproblema performanței prin scalare pe orizontală[analogie cu indecșii parțiali în care fiecarepartiție este stocată pe o mașina diferită].
• Această scalabilitate este totuși limitată la operațiile de scriere într-un model denumit“eventual consistency” [Consistency / Availability / Partition tolerance = CAP theorem] http://en.wikipedia.org/wiki/CAP_theorem
22
![Page 23: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/23.jpg)
Timpi de răspuns
• Mai mult hardware de obicei nu îmbunătățește sistemul.
• Latency al HDD [problema apare cand datelesunt culese din locații diferite ale HDDului – de exemplu în cadrul unei operații JOIN]. SSD?
23
![Page 24: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/24.jpg)
“Facts”
• Performance has two dimensions: response
time and throughput.
• More hardware will typically not improve
query response time.
• Proper indexing is the best way to improve
query response time.
24
![Page 25: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/25.jpg)
Join
25
![Page 26: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/26.jpg)
Join
An SQL query walks into a bar and sees two tables.
He walks up to them and asks ’Can I join you?’
— Source: Unknown
• Join-ul transformă datele dintr-un model normalizat într-unul denormalizat care servește unui anumit scop.
• Sensibil la latențe ale discului (și fragmentare).
26
![Page 27: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/27.jpg)
Join
• Reducerea timpilor = indexarea corecta
• Toți algoritmii de join procesează doar douătabele simultan (apoi rezultatul cu a treia, etc).
• Rezultatele de la un join sunt pasate în următoarea operație join fără a fi stocate.
• Ordinea în care se efectuează JOIN-ulinfluențează viteza de răspuns.[10, 30, 5, 60]
• QO încearcă toate permutările de JOIN.
• Cu cât sunt mai multe tabele, cu atăt mai multeplanuri de evaluat. [câte ?]
27
![Page 28: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/28.jpg)
Join
• Cu cât sunt mai multe tabele, cu atât maimulte planuri de evaluat = n!
• Nu este o problemă când sunt utilizațiparametri dinamici [De ce ?]
• Nested Loops
• Hash Joins
• Merged Joins
28
![Page 29: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/29.jpg)
Join – Nested Loops (anti patern)
• Ca și cum ar fi două interogări: cea exterioarăpentru a obține o serie de rezultate dintr-o tabelă și cea interioară ce preia fiecare rândobținut și apoi informația corespondentă din cea de-a doua tabelă.
• Se pot folosi Nested Selects pentru a simulaalgoritmul de nested loops [latența rețelei, usurința implementării, Object-relational mapping (N+1 selects)].
29
![Page 30: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/30.jpg)
Studiu de caz…
select scholarship from
fg join students on
fg.lnamea=students.lname
where fg.lnamea like 'A%';
• Care credeţi că va fi tabela interioară şi care cea exterioară ?
30
![Page 31: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/31.jpg)
Studiu de caz…
select scholarship from fg join students on fg.lnamea=students.lnamewhere fg.lnamea like 'A%';
• fg – cea exterioară pentru că “speră” ca dupăfiltrare să aibă puține rânduri (cu lname like ‘A%’)
• students – cea interioară
31
![Page 32: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/32.jpg)
Ce alege să facă când nu sunt indecşi ?
32
Deci va face hash join (bine, in acest caz)….
![Page 33: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/33.jpg)
Putem forţa tipul joinului:
select /* hint */scholarship from fg join students on fg.lnamea=students.lnamewhere fg.lnamea like 'A%';
• Hint:
+ USE_NL(students fg) - nested loops
+ use_hash – hash joins
+ use_merge(fg,students) parallel(fg, 4) parallel(students, 4) – merge joins
33
![Page 34: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/34.jpg)
Nested loops forţat (iese mai rău):
34
INTERESANT: filtrul LIKE ‘A%’ a fost pus peste fg.lnamea – puteți observa cum îl
aplică și în students (când îi caută pe cei care se “potrivesc”)
![Page 35: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/35.jpg)
Cum ați construi indecșii ?
• Ştiind cum funcţionează nested loops, indexulfiresc este în tabela din LOOP-ul interior, pecâmpul peste care se face join-ul.
• Din cauză că students era tabela interioară, săfacem indexul peste students.lname:
create index idx_students_lname on students(lname);
(de copiat pe tabla)
35
![Page 36: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/36.jpg)
Nested loops forţat (neimpresionant):
36
Se foloseste indexul ca sa gaseasca studentii – si se vede ca se face access pe
criteriul de join; filtrul este peste like… [costul totusi e 14.5k ]
![Page 37: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/37.jpg)
37
Estimare
Realitate
QO doar face o estimare a ceea ce se
intampla… daca ar face efectiv rularea
queryului sa obtina rezultatul real, ar pierde
mult timp (si nu ar mai fi “estimare” :D )
In fapt l-ar ajuta foarte mult ca din cele5M linii din fg sa ajunga rapid la cele133k pe care le doreste.
BUG ?!
![Page 38: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/38.jpg)
Atunci când avem nested loops:
• Indexați criteriul după care se face joinul din tabela interioară. Dacă veți indexa și ceva în tabela exterioară (pentru a face mai rapid accesul la liniile dorite, va fi perfect).
• În cazul de față ar fi interesant să facem accesacolo unde este lnamea.
• Se poate schimba ordinea tabelelor la fazaasta… cea interioară să devină exterioară…
38
![Page 39: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/39.jpg)
Să-l ajutăm aşadar….
create index idx_join_fg
on fg(lnamea);
(de copiat pe tabla)
39
![Page 40: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/40.jpg)
40
![Page 41: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/41.jpg)
Atunci când avem nested loops:
• Dacă veţi indexa criteriul exterior (dinafarajoinului), aveţi şanse să scădeţi foarte multtimpul operaţiei join.
• HOWEVER, când sunt utilizate joinurile de tipul nested loops, intotdeauna puneţi index pe criteriul de selecţie din tabela interioară (de fapt dacă găsește index, o va folosi dreptinterioară).
41
![Page 42: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/42.jpg)
Join – Cu doctrine putem vedea ce se intâmpla de fapt la nivel de cereri BD:
42
![Page 43: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/43.jpg)
Join – Ce fac unii “programatori”…
43
![Page 44: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/44.jpg)
Join – Ce se întâmplă în spate…
44
![Page 45: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/45.jpg)
PRO TIP
• Dacă aveţi de făcut nested loops, nu o faceţi în aplicaţia PHP / Java / orice altceva… Făceţi-o direct în serverul de baze de date:
- în BD nu avem latența din rețea;
- în BD nu sunt transferate datele intermediare(care sunt piped în BD);
- ORM-urile de obicei nu fac JOINurile în BD (ci le fac prin nested loops în interiorul app).
45
![Page 46: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/46.jpg)
Join – nested selects
• eager fetching – poate face un join automat pentru a-mi da direct toate informațiile(denormalizare)
• Totuși eager fetching nu este bun atunci cândeste nevoie doar de informații dintr-o tabelă.
• O configurare statică (în genul celor eager) nu este mereu o soluție bună.
• Cele mai multe ORM permit SQL joins:
46
![Page 47: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/47.jpg)
47
![Page 48: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/48.jpg)
Join – nested selects
• Sunt bune dacă sunt întoarse un număr mic de înregistrări.
• http://blog.fatalmind.com/2009/12/22/latency-security-vs-performance/
48
![Page 49: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/49.jpg)
Join – Hash join
• Evită traversarea multiplă a B-tree din cadrulinner-querry (din nested loops) construind câteun hash pentru înregistrările candidat.
• Dacă una din tabele este foarte mare, cealaltăeste incărcată în memorie, pe baza ei se construiește un hash având ca și chei câmpurileutilizate în join și ca valori restul rândului.
• Hash join îmbunătățit dacă sunt selectate maipuține coloane.
• A se indexa predicatele independente din where pentru a îmbunătăți eficiența.
49
![Page 50: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/50.jpg)
Având indecșii construiti anterior…
50
Am putea crede ca ambii indecsi participa “puternic” la realizarea JOIN-ului…De fapt daca scapam de IDX_STUDENTS_LANME (sorry for typo)…
![Page 51: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/51.jpg)
Doar IDX_JOIN_FG (peste lnameA):
51
Costul a crescut doar cu (era 127 si acum este 128). Deci de fapt eficienta vine din Indexarea conditiilor dinafara joinului.
![Page 52: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/52.jpg)
Join – Hash join
• Indexarea predicatelor utilizate în join nu
îmbunătățesc eficiența hash join !!!
• Un index ce ar putea fi utilizat este pestefg.lname (care este în clauza where)
52
![Page 53: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/53.jpg)
Join – Hash join
• Ordinea condițiilor din join nu influențeazăviteza deoarece oricum QO va încărca în memorie tabela mai mică și îi va face hash-ul(la nested loops ar fi influențat).
53
![Page 54: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/54.jpg)
Join – Sort Merge
• Combină două tabele preluând date fie
dintr-unul, fie din celălalt, fie din ambele.
• Aceiași indecși ca și la hash-join (adică doarpentru condițiile separate, nu și pentru celedin join).
• Ordinea joinurilor nu contează.
• Algoritm foarte util pentru outer joins (în care sunt întoarse înregistrările care fac match în ambele tabele) dar și pt L/R joins.
54
![Page 55: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/55.jpg)
55
![Page 56: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/56.jpg)
Şi aşa ar arăta fără nici un index:
56
![Page 57: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/57.jpg)
Join – Sort Merge
57
![Page 58: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/58.jpg)
Și un plan mai “exotic”
• Pentru:
select /*+ use_merge(fg,students)
parallel(fg, 4) parallel(students,
4) */ scholarship from
fg full outer join students
on fg.lnamea=students.lname
where fg.lnamea like 'A%';
58
![Page 59: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/59.jpg)
59
![Page 60: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/60.jpg)
60
Aici au fostindexatecampurile din criteriul de join (dar de faptlnamea like ‘A%’ e cel folosit…).
![Page 61: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/61.jpg)
Join – Sort Merge
• Destul de greoi de utilizat din cauză că ambeletabele trebuie să fie sortate după câmpulutilizat în join.
61
![Page 62: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/62.jpg)
Clustering Data
62
![Page 63: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/63.jpg)
Clustering Data
• Un cluster = serie de obiecte (de obicei de aceeași natură) ce apar împreună.
• Un cluster de calculatoare este o grupare de calculatoare care “se ajută” simultan.
• Utilizate pentru
- a rezolva o problema complexa (high
performance clusters)
- a mari disponibilitatea (failover cluster)
63
![Page 64: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/64.jpg)
Clustering Data
• În cazul calculatoarelor mai există un tip de cluster: Data Cluster
• Clustering data = așezarea datelor ce au probabilitatea imediată de acces unele lângaaltele (de exemplu atunci când defragmentăm HDD-ul, facem acest tip de clusterizare).
• Computer cluster este destul de întâlnit șiîntre cele două se face confuzie (“Let’s use a cluster to improve DB performance” )
64
![Page 65: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/65.jpg)
Clustering Data
1. Cel mai simplu tip de cluster este rândul: bazele de date stochează toate coloaneledintr-un rând în același block (DB block) dacăe posibil.
Column Stores
Column oriented databases, or column-stores, organize tables in a columned way. This model is beneficial when accessing many rows but only a few columns—a pattern that is very common in data warehouses (OLAP).
65
![Page 66: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/66.jpg)
Clustering Data
2. Indecșii construiesc clustere de rânduri –frunzele B-tree-ului stochează coloanele
într-o maniera ordonată (valorile consecutive sunt puse unele lângă altele).
• Indecșii construiesc clustere de rânduri cu
valori similare = second power of indexing.
66
Si cum de obicei avem nevoie de valori apropiate, le putem prelua mai multe dintr-o data.
![Page 67: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/67.jpg)
Clustering Data- Index Filter Predicates Used Intentionally
• Când apare “Index filter” de multe oriînseamnă că indexul nu a fost construit corectși că probabil există o variantă mai eficientă (în care ceea ce este filtrat este folosit de index).
• Index filtering poate fi folosit și într-un scopbun: pentru gruparea datelor ce sunt accesateconsecutiv.
67
![Page 68: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/68.jpg)
Clustering Data- Index Filter Predicates Used Intentionally
• Clauzele WHERE ce nu pot fi utilizate ca șipredicate de acces sunt cele mai bune pentruaceastă tehnică:
SELECT lnameA, fnameA, dobA FROM fg
WHERE valueA = ?
AND UPPER(lnameA) LIKE '%ACK%';
Indexul e inutil indiferent dacă e după lnameA sau după
upper(lnameA). Dupa ce indexăm ?68
![Page 69: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/69.jpg)
No index…
69
![Page 70: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/70.jpg)
Clustering Data- Index Filter Predicates Used Intentionally
• Tabble acces nu este neapărat o povară dacăînregistrările ar fi stocate grupat în acelașiblock și BD ar putea să le returneze într-o singură operație de tip read.
• Dacă rândurile sunt dispersate, BD va trebui săcitească din fiecare block în parte.
• Eficiența depinde de distribuția fizică a datelor.
70
![Page 71: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/71.jpg)
Index on fg(valueA)
71
Avantajul este ca le gaseste pe toate cu valoarea 9 “dintr-un foc”.
![Page 72: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/72.jpg)
Clustering Data- Index Filter Predicates Used Intentionally
• Corelația dintre ordinea din index și cea din tabelă se numește index clustering factor.
(nr blocuri < ICF < nr rânduri)
• ICF = dacă am un număr de rânduri ce pot fistocate în nr blocuri, atunci putem sa le citimdin nr randuri accesari la HDD (dacă nu găsimniciodată două consecutive în același bloc) saudin nr blocuri (dacă la o citire toate suntpreluate corect și în ordinea dorită).
72
![Page 73: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/73.jpg)
Clustering Data- Index Filter Predicates Used Intentionally
• Corelația dintre ordinea din index și cea din tabelă se numește index clustering factor.
(nr blocuri < ICF < nr rânduri)
• Este posibilă îmbunătățirea eficienței re-aranjând rândurile din tabel (ce se întâmplădacă avem doi indecși diferiți ?)
• Chiar dacă am face ordonarea după un singurindex, și așa e complicat pentru că BD nu permite decât un acces rudimentar la aceastăordine (row sequencing).
73
![Page 74: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/74.jpg)
Clustering Data- Index Filter Predicates Used Intentionally
• Aici apare partea cu clusterizarea: utilizareaunui index din două coloane pentru a fistocate într-o ordine bine definită.
• Se va extinde indexul pentru a acoperi chiar șicoloana “neindexabilă”:
74
![Page 75: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/75.jpg)
Index on fg(valueA, Upper(lnameA))
75
De ce este mai bine așa ?
![Page 76: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/76.jpg)
Clustering Data- Index Filter Predicates Used Intentionally
• Se observă că filtrul este direct aplicat în pasul 2.
• De data aceasta pasul 2 returnează doar 968 rânduri (în cazul anterior erau 19369).
76
![Page 77: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/77.jpg)
Clustering Data- Index Filter Predicates Used Intentionally
• Această abordare ignoră relevanța ordiniicoloanelor. De obicei, partea ce va fi filtratăeste bine să fie pusă ultima (pentru ca indexulsă meargă corect pe primele coloane – adicăsă facă acces).
• Nu adăugați toate coloanele în index
77
![Page 78: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/78.jpg)
Clustering Data- Index-Only Scan
• Una dintre cele mai puternice metode de “tuning”.
• Nu numai că evită evaluarea clauzei where darevită accesarea tabelei atunci când coloaneleselectate se găsesc chiar în index.
78
![Page 79: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/79.jpg)
Clustering Data- Index-Only Scan
create index idx_only_scan on fg(lnameA,
fnameA, dobA);
select fnameA, lnameA, dobA from fg where
lnameA = 'Jackson';
79
![Page 80: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/80.jpg)
Clustering Data- Index-Only Scan
• Indexul acoperă întreaga interogare și din acest motiv se mai numește “covering index” (poate fi identificat prin faptul că nu esteaccesată deloc tabela ci doar indexul).
• Numărul mare de linii selectate poate avea un impact negativ asupra eficienței (mai ales dacănu sunt în același cluster – de exemplu dacă așcăuta și după un anumit dob ar putea merge mai greu decât dacă aș căuta numai dupălnamea și fnamea). 80
![Page 81: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/81.jpg)
81
![Page 82: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/82.jpg)
Clustering Data- Index-Only Scan
• Index-only este o strategie agresivă.
• Nu proiectați indexul în acest scop pentru căe ca și cum ați copia tabela cu bucățile care văinteresează – ocupă spațiu și timp pentruoperații insert / edit / delete (reechilibrarea B-tree).
82
![Page 83: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/83.jpg)
Clustering Data- Index-Only Scan
• Index-only scan poate cauza suprize neplăcute
select fnameA, lnameA, dobA from fg
where lnameA = 'Jackson' AND valueA
between 4 and 10;
• Ce se întâmplă ?
83
![Page 84: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/84.jpg)
• Din cauza că se face acces în tabelă, costul a crescut. Accesarea oricărei coloane care nu este în index va avea acest efect.
84
![Page 85: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/85.jpg)
Clustering Data- Index-Only Scan
• Scrieţi comentarii când folositi selecturi de tipul Index-Only scan pentru a vă asigura că nu adăugaţi din greşeala noi predicate ce vorîmpiedica accesul în stilul index-only scan.
• Scrieţi comentarii când doriţi să faceţiselecturi cu index only scan (în php/java/etc)
85
![Page 86: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/86.jpg)
Clustering Data- Index-Only Scan
• Altă problemă poate să apară de la FBI.
• UPPER(fnameA) nu poate fi folosit în Index Only Scan dacă se doreşte selectarea coloaneifnameA (pentru că indexul ţine minte valoareafuncţiei şi nu valoarea coloanei) – încercaţi săindexaţi valoarea originală dacă ştiţi că o veţifolosi tot pe ea.
• Nu se va aplica o funcţie pe un câmp din index.
86
![Page 87: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/87.jpg)
Clustering Data- Index-Only Scan
• Mereu selectaţi doar coloanele de care aveţinevoie. Dacă selectaţi de genul “select * …” în nici un caz nu veţi folosi Index-Only Scan.
• Există anumite limitări în ceea ce priveştedimensiunea indexului (deci nu puteți punetot în index pentru a face numai Index-only Scan):
87
![Page 88: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/88.jpg)
Limitations of Index-Only Scan
• The maximum index key length depends on the block size and the index storage parameters (75% of the database block size minus some overhead). A B-tree index is limited to 32 columns.
• When using Oracle 11g with all defaults in place (8k blocks), the maximum index key length is 6398 bytes. Exceeding this limit causes the error message “ORA-01450: maximum key length (6398) exceeded.”
88https://docs.oracle.com/cd/B19306_01/server.102/b14231/indexes.htm
![Page 89: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/89.jpg)
Clustering Data- Index-Only Scan
• Interogările care nu selectează nici o coloanădin tabel sunt executate cu Index-Only scans.
Puteţi găsi un exemplu ?
89
![Page 90: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/90.jpg)
Clustering: Index-Organized Tables
• Index-Only Scan execută interogarea SQL doarfolosind informaţiile redundante existente în index.
• Dacă am pune toate informaţiile în index, de ce am mai avea nevoie de tabela originală ?
• Într-adevăr, există aceasta abordare: index-
organized tables (IOT) sau clustered index.
90
![Page 91: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/91.jpg)
Clustering: Index-Organized Tables
• Avantaje:
- nu se mai foloseşte tabelul şi se poate
renunţa la el;
- orice acces într-un IOT este un index-only
scan.
• Ambele avantaje “sună bine” dar sunt greu de obţinut în practică.
91
![Page 92: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/92.jpg)
Clustering: Index-Organized Tables
• Problema: când se doreşte un nou index peaceeaşi tabelă: noul index va pointa prinintermediul unei chei către informaţia logicadin indexul original (şi va face index unique scan dupa aceasta cheie).
• Accesarea unui IOT după un al doilea index este foarte ineficientă.
92
![Page 93: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/93.jpg)
Clustering: Index-Organized Tables
93
Index peste “date”
![Page 94: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/94.jpg)
Clustering: Index-Organized Tables
• Al doilea index păstrează clustering keys pentru fiecare înregistrare.
• Am putea de exemplu să interogăm doar ID-urile (şi accesul ar fi de tipul index-scan only):
94
![Page 95: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/95.jpg)
Clustering: Index-Organized Tables
• Eficienţa este pierdută atunci când este folositun al doilea index.
• Clustering key este de obicei mai lung decât ROWID (deci şi indecşii secundari vor ocupamai mult spaţiu).
• Concluzia: DOAR tabelele ce folosesc un singurindex sunt cel mai bine să fie implementate ca un IOT.
95
![Page 96: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/96.jpg)
Clustering: Index-Organized Tables
96
![Page 97: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/97.jpg)
Indecşii în sortare
(ORDER BY)
97
![Page 98: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/98.jpg)
Sortarea
• Sortarea este o acţiune anevoioasa pentrubazele de date, în principal pentru că toateînregistrările trebuie aduse într-un buffer în care să se facă sortarea.
• Indecşii reţin informaţiile într-o manieră
ordonată – deci putem utiliza un index pentrua uşura munca operaţiilor de tip “order by”.
98
![Page 99: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/99.jpg)
Sortarea
• Un INDEX RANGE SCAN care întoarce multerânduri poate fi ineficient – pentru că timpulnecesar pentru row acces ar putea fi mai mare decât dacă s-ar face FULL TABLE SCAN şi apois-ar sorta rezultatele.
99
![Page 100: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/100.jpg)
Sortarea
• Un index construit dupa criteriul ce este utilizat în clauza ORDER BY va evita operaţia de sortare şi vaputea întoarce foarte rapid înregistrările dintr-un anumit interval.
• Indexul face ca operaţiile de tip ORDER BY să fie executate într-o maniera pipelined = 3rd power of index.
• Pipelining negates the need to build huge collections by piping rows out of the function as they are created, saving memory and allowing subsequent processing to start before all the rows are generated.
• Din cauza ca sunt gata sortate in index, nu trebuie sa le mai preia din tabela si sa le sorteze. Poate saciteasca primul rowid direct din index si sa stie ca e primul, sa se duca apoi in tabela si sa preiarestul informatiilor si sa le emită apoi sa mearga pe al doilea rowid etc….
100
![Page 101: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/101.jpg)
Indexarea pentru ORDER BY
• Interogările SQL cu o clauza ORDER BY nu trebuie să sorteze rezultatul dacă indexul dejaoferă această ordine:
select lnameA, fnameA, dobA
from fg
order by dobA;
101
![Page 102: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/102.jpg)
Indexarea pentru ORDER BY
Fără index:
Observaţi că de fapt sortarea face costul să“sară”…
102
![Page 103: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/103.jpg)
Indexarea pentru ORDER BY
• Pentru a scapa de sortare, ar trebui ca indexulsa fie construit peste criteriul de ordonare:
create index idx_dobA on fg(dobA);
103NU FOLOSESTE INDEXUL… DE CE?
![Page 104: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/104.jpg)
Indexarea pentru ORDER BY
• Doua posibilităţi: interogăm doar dob (ca sănu mai facă table access) sau introducem în index si lnameA, fnameA.
create index idx_dobA on
fg(dobA, lnameA, fnameA);
104
![Page 105: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/105.jpg)
Indexarea pentru ORDER BY
• Să încercăm acum un index peste douăcâmpuri: valueA & dobA.
create index idx_vala_doba on fg(valuea,
doba);
Cum va fi executat urmatorul select:select valuea, doba from fg where
valuea=9 order by doba;
?
105
![Page 106: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/106.jpg)
106
Se face access dupa VALUEA si apoi se citesteIndexul pentru ca datele sunt deja sortateDupa câmpul dob.
![Page 107: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/107.jpg)
Indexarea pentru ORDER BY
107
![Page 108: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/108.jpg)
Listă dublă înlănţuită
• Dacă frunzele nu ar fi dublu înlănţuite, atuncinu am putea ca, utilizând acelaşi index săcerem datele în ordine descrescătoare şi să nu apară sortare… să vedem dacă apare sort:
108
![Page 109: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/109.jpg)
Indexarea pentru ORDER BY
• Ce se întamplă dacă mărim intervalul căutat ?
select valuea, doba from fg where valuea
IN (8,9) order by doba;
109
![Page 110: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/110.jpg)
Indexarea pentru ORDER BY
110
![Page 111: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/111.jpg)
111
Utilizează indexul pentru a găsi exact liniile ce trebuieîntoarse dar acestea vor fi reordonate.(pentru că în index nu sunt aşezate după doba).
![Page 112: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/112.jpg)
112
CREATE INDEX exemplu ON tabel(A,B);
SELECT * FROM tabel
WHERE A >1 AND A<4
ORDER BY A,B;
Merge pe index pana gaseste inceputulintervalului unde A>1 si A<4, ajunge la cuplul (2,a) dupa care continua pe listadublu inlantuita pana ajunge la (3,d).
![Page 113: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/113.jpg)
113
CREATE INDEX exemplu ON tabel(A,B);
SELECT * FROM tabel
WHERE A >1 AND A<4
ORDER BY A,B desc;
Merge pe index pana gaseste inceputulintervalului unde A>1 si A<4, ajunge la cuplul (2,a). In continuare, daca ar merge pe lista dublu inlantuita nu ar puteafurniza coloana B in ordinedescrescatoare.
![Page 114: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/114.jpg)
114
CREATE INDEX exemplu ON tabel(A,B
desc);
Sau ?
CREATE INDEX exemplu ON tabel(A
desc,B);
SELECT * FROM tabel
WHERE A >1 AND A<4
ORDER BY A,B desc;
![Page 115: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/115.jpg)
115
CREATE INDEX exemplu ON tabel(A,B
desc);
Sau ?
CREATE INDEX exemplu ON tabel(A
desc,B);
Cand criteriul de ordonare este invers fata de ordinea existenta in index, acesta (indexul) esteparcurs in sens invers…
![Page 116: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/116.jpg)
Indexarea pentru ORDER BY
• Dacă BD foloseşte o operaţie de sortare chiarcând vă aşteptaţi la o execuţie pipelined, motivul este unul din următoarele două:
- QO consideră că execuţia este optimă în
acest fel.
- Ordinea indecşilor nu corespunde clauzei
“ORDER BY”• Puteţi să vă daţi seama de motiv folosind un full index definition în
clauza order by.
116
![Page 117: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/117.jpg)
Indexarea pentru ORDER BY
• Atunci cand totusi QO prefera sa sorteze lista, acest lucru se intampla pentru ca prefera safaca operatia peste toata lista (de exemplupentru ca oricum trebuie sa incarce toateinregistrarile) si ordonarea nu i-ar lua mai multtimp decat daca ar citi din indecsi si ar accesatabela pentru fiecare rowid.
117
![Page 118: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/118.jpg)
ASC/DESC/NULL FIRST,LAST
• BD pot citi indecşii în ambele direcţii.
• Indecşii sunt folosiţi şi dacă ORDER BY trebuiesă întoarcă rezultatul în ordine inversă.
• Modificatorii ASC/DESC pot schimba execuţiade tip pipedline într-una în care trebuie făcutăsortarea.
• Avem indexul peste fg(valuea,doba)
• dobA poate fi NULL…
118
![Page 119: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/119.jpg)
ASC/DESC/NULL FIRST,LAST
select valuea, doba from fg where valuea
between 8 and 9 order by valuea,doba;
• În acest caz, planul de execuţie arată astfel:
119
![Page 120: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/120.jpg)
Indexarea pentru ORDER BY
120
![Page 121: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/121.jpg)
ASC/DESC/NULL FIRST,LAST
select valuea, doba from fg where valuea
between 8 and 9 order by valuea desc,doba
desc;
• În acest caz, planul de execuţie arată astfel:
121
![Page 122: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/122.jpg)
Indexarea pentru ORDER BY
122
![Page 123: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/123.jpg)
ASC/DESC/NULL FIRST,LAST
select valuea, doba from fg where valuea
between 8 and 9 order by valuea asc,doba
desc;
• În acest caz, planul de execuţie arată astfel:
123
![Page 124: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/124.jpg)
De ce ?
124
![Page 125: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/125.jpg)
ASC/DESC/NULL FIRST,LAST
• Este crucial ca indexul să fie EXACT
- în aceeaşi ordine cu ce se cere în ORDER BY
- în ordine inversă faţă de ce se cere în clauzaORDER BY!
125
![Page 126: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/126.jpg)
ASC/DESC/NULL FIRST,LAST
• Pentru cazuri ca cel precedent, cele mai multeBD oferă posibilitatea de a crea indecşi într-o anumită ordine.
126
![Page 127: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/127.jpg)
ASC/DESC/NULL FIRST,LAST
create index idx_vala_doba on fg(valuea desc ,doba asc);
SAUcreate index idx_vala_doba on
fg(valuea asc, doba desc);
• [MySQL ignora ASC/DESC din definiţia indecşilor]
• Noua definiţie nu afectează căutarea în clauzaWHERE.
127
Eu am ales săîl fac pe acesta.
![Page 128: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/128.jpg)
select valuea, doba from fg
where valuea between 8 and 9
order by valuea desc, doba asc;
128
![Page 129: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/129.jpg)
ASC/DESC/NULL FIRST,LAST
• Dupa crearea noului index, se va evitasortarea (din nou):
129
![Page 130: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/130.jpg)
ASC/DESC/NULL FIRST,LAST
• ASC/DESC sunt utilizate pentru a inversaordinea anumitor coloane. Nu este nevoie săle sortam pe toate DESC. De ce ?
130
![Page 131: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/131.jpg)
ASC/DESC/NULL FIRST,LAST
• Inafară de ASC/DESC, SQL permite înca doimodificatori pentru ORDER BY (NULL FIRST sauNULL LAST).
• Problema apare din cauza ca nu se poatespecifica ordinea pentru NULL (în index).
• Nu este implementată nici de SQL server 2012 şi nici de MySQL 5.6.
• Oracle SQL suporta sortarea NULL-urilorînainte sa fie introdus în standard dar nu permite indexarea lor nici macar în 11g.
131
![Page 132: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/132.jpg)
ASC/DESC/NULL FIRST,LAST
• Oracle nu va permite pipeline atunci cand se va face sortare cu NULLS FIRST.
• PostgreSQL suporta (din ver 8.3) modificatoriNULLS atât în ORDER BY cât şi în definireaindecşilor.
132
![Page 133: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/133.jpg)
ASC/DESC/NULL FIRST,LAST
133Idee de studiu individual: demonstraţi că Oracle indexează default NULL la sfârşit.
![Page 134: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/134.jpg)
Indecşii în grupare
(GROUP BY)
134
![Page 135: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/135.jpg)
Indexarea GROUP BY
• BD SQL folosesc doi algoritmi diferiti:
1) algoritm Hash care face agregare de înregistrări într-o tabela hash. După ce toateinputurile au fost procesate, se returneazătabela hash (nu şi in MySQL 5.6)
2) sort/group: întâi sortează datele după cheilede grupare a.i. ele sa fie consecutive dupăcare le face agregare.
135
![Page 136: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/136.jpg)
Indexarea GROUP BY
• Ambii algoritmi au paşi intermediari(construire de hashuri / sortarea) şi din acestmotiv nu pot fi executaţi în maniera pipelined.
• Totuşi, algoritmul sort/group (al doilea) poateutiliza un index pentru a evita sortarea, în acest fel dând posibilitatea de efectuare a pipeline chiar şi în cadrul grupărilor.
136
![Page 137: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/137.jpg)
Indexarea GROUP BY
• Pentru a se produce un pipedlined group by, trebuie să fie indeplinite aceleaşi condiţii ca şiîn cazul lui order by.
• Aceeaşi observaţie pentru NULLS FIRST/LAST.
• Există baze de date care nu pot procesa corectASC/DESC indexarea pentru a face pipelined group by [In PostgreSQL trebuie adaugat un order by pentru a face un NULLS LAST ce va fifolosit in group by].
137
![Page 138: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/138.jpg)
Indexarea GROUP BY
• Pentru a returna liniile în ordine inversă, indexul putea fi parcurs invers (în cazul ORDER BY).
• În Oracle nu se poate citi un index în ordineinversă pentru a se executa un piped group by
dacă este urmat de un order by.
138
![Page 139: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/139.jpg)
Primele n înregistrări
139
![Page 140: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/140.jpg)
Rezultate parţiale
• Uneori nu sunt necesare toate liniile uneiinterogari SQL ci doar primele n (câteva) linii[fie pentru o afişare paginată fie pentru un “scroll infinit”].
• Asta ar putea crea probleme de performanţădacă toate inregistrările trebuie sortate pentrua fi returnate doar primele n. Din acest motiv, un “pipelined ordered by” este o optimizareputernică.
140
![Page 141: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/141.jpg)
Rezultate parţiale
• Un pipelined ORDER BY nu este atat de important din cauza ca poate sa returnezerandurile sortate, ci mai degraba pentru ca poate sa returneze primele n randuri fara satreaca prin toate (pipelined ORDER BY are cost mic de pornire).
141
![Page 142: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/142.jpg)
Primele n inregistrari
• Atunci cand se doreste preluarea primelor n
inregistrari, QO nu isi da seama ca se dorescnumai acele n.
• QO ar trebui sa stie daca in final aplicatia vaprelua toate inregistrarile – atunci un full scan
urmat de sortare ar fi cea mai buna solutie. Chiar si asa, un piped order by ar aduce un +.
• Tip: spune-i BD cand nu ai nevoie de toate
inregistrarile - fetch first.142
![Page 143: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/143.jpg)
Primele n inregistrari
• fetch first – in SQL:2008, disponibil in IBM DB2, PostgreSQL, SQL Server 2012, Oracle 12c.
SELECT val FROM rownum_order_test
ORDER BY val DESC
FETCH FIRST 5 ROWS ONLY;
[Oracle 12c]
143
![Page 144: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/144.jpg)
Primele n inregistrari
• In Oracle 11g…
• Sa consideram urmatoarea interogare Oracle:SELECT * FROM (
SELECT *
FROM fg WHERE valuea=9
ORDER BY doba DESC )
WHERE rownum <= 10;
144
![Page 145: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/145.jpg)
Primele n inregistrari
145
Si-a dat seama ca trebuie sa numere doar 10.
![Page 146: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/146.jpg)
Primele n inregistrari
• BD poate optimiza interogarea doar daca stiede la inceput ce rezultat partial este asteptat.
• Va prefera sa utilizeze un pipelined order by:
• Utilizarea unei sintaxe corecte este numaijumatate din job.
• Pentru ca sa poata numara doar primele 10 inregistrari, trebuie ca neaparat sa aiba un order by care sa poata fi piped (altfel ar trebuisa sorteze tot).
146
![Page 147: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/147.jpg)
Primele n inregistrari
create index idx_doba on fg(valuea,doba);
147
![Page 148: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/148.jpg)
Daca ar fi nevoit sa ia toateinregistrarile (si nu doar primele 10):
148
Deci e clar că în cazul precedent, a “ştiut” să se oprească după primele 10.Asta din cauză că în timp ce face pipe, le şi numără.
![Page 149: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/149.jpg)
Primele n inregistrari
• Avantajul nu este numai în performanţa imediată ci şi în scalabilitatea mărită. Fărăpipelined execution, timpul creşte direct proporţional cu dimensiunea tabelei (cândsunt piped, timpul este aproape identic).
http://blog.fatalmind.com/2010/09/29/finding-the-best-match-with-a-top-n-query/
149
![Page 150: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/150.jpg)
Paginarea rezultatelor
150
![Page 151: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/151.jpg)
Paginarea rezultatelor
• Ce se întâmplă după ce s-au întors primele n
rezultate ?
• Avem nevoie de rezultatele [n+1 .. 2n] (pentruurmătoarea pagină).
• Există două metode:
- offset method (numara liniile de la inceput, filtreaza dupa row
number si face discard la ce e in plus)
- seek method (cauta ultima intrare din pagina precedenta si preia
randurile urmatoare)
151
![Page 152: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/152.jpg)
Paginarea rezultatelor - offset
• Metoda offset utilizeaza un cuvant special “offset” – SQL Server standard ca si extensiepentru fetch first.
SELECT * FROM sales
ORDER BY sale_date DESC
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;
152
![Page 153: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/153.jpg)
Paginarea rezultatelor - offset
• În Oracle e puţin mai complicat…
SELECT * FROM
(SELECT tmp.*, rownum rn FROM
(SELECT *
FROM fg WHERE valuea=9
ORDER BY doba DESC )
tmp WHERE rownum <= 20)
WHERE rn > 10;
153
![Page 154: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/154.jpg)
154
Va trebui să ia 20 de rânduri şi să arunce primele 10.Pe pagina n va lua n*10 rânduri si va arunca (n-1)*10.
![Page 155: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/155.jpg)
Paginarea rezultatelor - offset
• Două dezavantaje:
- pagina se shiftează când sunt adăugate
înregistrari noi (pentru că o numără şi pe
cea nou adăugată);
- timpul de răspuns este mare când se
accesează paginile cu număr mare.
155
![Page 156: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/156.jpg)
Paginarea rezultatelor - seek
• Metoda seek utilizeaza valoarile din paginaanterioară ca punct de plecare şi evită ambeledezavantaje ale metodei offset.
• Caută înregistrările care urmează ultimeiînregistrări de pe pagina anterioară (utilizândun simplu WHERE).
156
![Page 157: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/157.jpg)
Paginarea rezultatelor - seek
• Presupunând că se pune o singură notă pe zi(deci data ar fi cheie unică):
SELECT * FROM fg
WHERE doba < ?
ORDER BY doba
DESC FETCH FIRST 10 ROWS ONLY;
? = Ultimul sale_date de pepagina precedenta
157
![Page 158: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/158.jpg)
Paginarea rezultatelor - seek
• Problema este ca dacă nu avem o cheie unicăla sfârşit de pagină, se poate întâmpla să nu ştim de unde începem pagina următoare.
• Trebuie ca order by să fie determinist* altfelse poate întâmpla ca o nouă execuţie să facăun shuffle a înregistrărilor (din cauză că QO se hotărăşte să execute altfel interogarea şiatunci putem să ne trezim că s-a facut “swap” între ultima înregistrare de pe paginaanterioară şi prima de pe noua pagină).
*De exemplu nu ordonati dupa rownum care este o psudocoloana ce este construita de fiecare data la un nou apel.
158
![Page 159: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/159.jpg)
Paginarea rezultatelor - seek
• Pentru a ne asigura că ORDER BY este mereudeterminist, am putea să-l extindem(adăugând coloane) până ajungem la unicate(sau dacă nu se poate, se adaugă un câmp unic) – vezi “cheie candidat” de la BD.
159
![Page 160: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/160.jpg)
Scalabilitate offset vs seek
160
![Page 161: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/161.jpg)
Functii Window -> paginare
• Metoda flexibila, conform standardului.
• Numai SQL server şi Oracle le utilizează pentruun pipelined n-querry
• PostgreSQL nu se opreşte din scanat după ce a preluat primele n linii
• MySQL nu are deloc implementată o astfel de funcţie
161
![Page 162: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/162.jpg)
Functii Window -> paginare
SELECT * FROM (
SELECT fg.* , ROW_NUMBER() OVER
(ORDER BY doba DESC ,
id DESC) rn
FROM fg) tmp
WHERE rn between 11 and 20
ORDER BY doba DESC, id DESC;
162
rownum cu valorile dupacriteriul de ordonare
![Page 163: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/163.jpg)
Functii Window -> paginare
• ROW_NUMBER enumeră rândurile în funcţiede ordinea de sortare definită în clauza over.
• Ultimul where foloseşte valoarea lui rn pentrua prelua doar înregistrările 11-20.
• BD Oracle recunoaşte condiţia de oprire şiutilizează indecşii SALE_DATE si SALE_ID pentru a produce un comportament pipelined
163
![Page 164: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/164.jpg)
Functii Window -> paginare
164
Deşi costul calculateste mare, timpulexecuţiei este de 0
secunde !
![Page 165: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/165.jpg)
Functii Window -> paginare
165
Operatie de tip NOSORT = pipelined
Ce se opreste cand se ajunge la o anumita valoare (stopkey)
![Page 166: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/166.jpg)
Functii Window -> paginare
• Ce le face pe funcţiile window să fie importante nu este neapărat paginarea ci maidegrabă calculele analitice.
166
![Page 167: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/167.jpg)
Insert, Update, Delete
167
![Page 168: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/168.jpg)
Insert, Update, Delete
• Insert + Update + Delete = DML (Data Manipulation Language)
• Performanţa acestor comenzi este influenţată(negativ) de prezenţa indecşilor.
• Indexul = date redundante. Când suntexecutate comenzile sus menţionate, indecşii trebuie refăcuti şi ei.
168
![Page 169: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/169.jpg)
Insert
• Insertul este influenţat în primul rând de numărul indecşilor.
• Insertul nu are cum să beneficieze de pe urmaindecşilor deoarece nu are o clauza “where”.
169
![Page 170: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/170.jpg)
Insert
• Inserarea unui rand intr-o tabela presupune:
- gasirea unei locatii pentru stocare [in tabelele fara indecsi, se cauta un block care are suficient spatiu si este adaugat acolo]
- daca exista indecsi peste tabela, BD trebuiesa se asigure ca noua inregistrare apare in indecsi (va adauga cate o intrare in fiecare)
170
![Page 171: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/171.jpg)
Insert
- adaugarea in index este mai costisitoarepentru ca arborele trebuie rebalansat. Din cauza existentei arborelui, inregistrarea nu poate fi scrisa in orice block; ea apartine uneianumite frunze din B-tree. Pentru a ajunge la locatie trebuie traversat arborele
171
![Page 172: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/172.jpg)
Insert
- dupa indentificarea frunzei BD confirma dacamai exista spatiu in nodul respectiv. Daca nu mai exista, nodul este impartit in doua sidistribuie intrarile intre vechiul si noul nod (aici apar referinte noi si in nodul superior care la randu-i poate fi impartit). Daca toatenodurile pana la radacina sunt impartite, arborelui i se mai adauga un nivel.
172
![Page 173: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/173.jpg)
Insert
• Timpul unui insert in functie de numarul de indecsi:
173
![Page 174: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/174.jpg)
Insert
• Primul index face cea mai mare diferenta
• Considerand ca intr-o tabela s-ar face numaiinserturi, e mai bine fara indecsi.
• Performanta fara indecsi este atat de buna ca
uneori are sens sa renuntam la indecsi atunci
cand incarcam cantitati mari de date (indecsii
nu trebuie refacuti in timpul incarcarii ci
numai o singura data la final).
174
![Page 175: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/175.jpg)
Insert
• Cum s-ar proceda in cadrul unei “index organized table” sau “clustered index” ?
175
![Page 176: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/176.jpg)
Delete
• Delete are o clauza “where” care o face sabeneficieze de pe urma indecsilor. Funtioneaza ca un select urmat de stergereadatelor.
• Stergerea unui rand este inversa fata de inserarea unui rand.
176
![Page 177: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/177.jpg)
Delete
• Eficienta operatiei delete este reprezentata in tabelul:
177
![Page 178: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/178.jpg)
Delete
• Daca nu exista index, BD trebuie sa faca full
table scan pentru a cauta inregistrarea.
• Are sens sa stergem fara “where” atunci candsunt sterse foarte multe randuri.
• Operatiile delete si update au un execution plan (incercati acasa).
178
![Page 179: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/179.jpg)
Update
• O operatie de tip Update trebuie sa realoceindexul (sa stearga vechea pozitie si sa realoceinformatia in alta pozitie).
• Update (la fel ca insert si delete) depinde de numarul indecsilor peste tabela.
• Daca updateul nu modifica campurile din indecsi, timpul este minim (pentru ca indecsiinu trebuie refacuti).
179
![Page 180: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/180.jpg)
Update
180
![Page 181: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/181.jpg)
Update
• Daca este afectat un singur index (prin afectat se intelege ca trebuie sa fie re-aranjat), timpulramane acelasi chiar daca sunt mai multi indecsipeste tabela.
• Cand se scrie comanda update, trebuie avut grijasa fie modificate doar acele coloane care trebuiemodificate si nu toate coloanele (utilizand valorivechi in update).
Ganditi-va la un caz cand insert sau delete nu afecteaza indexul peste o tabela. Raspuns: cand sunt campuri null adaugate si nu sunt trecute in index.
181
![Page 182: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/182.jpg)
Bibliografie (online)
• http://use-the-index-luke.com/
( puteti cumpara si cartea in format PDF – darnu contine altceva decat ceea ce este pe site)
182
![Page 183: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/183.jpg)
Joins – INNER JOIN
• http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins
• Cel mai simplu tip de join, interogarea vareturna toate inregistrarile din A care au inregistrari pereche in tabela B.
SELECT <select_list>
FROM Table_A A
INNER JOIN Table_B B
ON A.Key = B.Key183
![Page 184: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/184.jpg)
Joins – LEFT JOIN
• Returneaza inregistrarile din tabela A indiferent daca au un match in tabela B. Dacain tabela B sunt inregistrari care fac match, le va potrivi.
SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
184
![Page 185: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/185.jpg)
Joins – RIGHT JOIN
• Returneaza inregistrarile din tabela B indiferent daca au un match in tabela A. Dacain tabela A sunt inregistrari care fac match, le va potrivi.
SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key
185
![Page 186: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/186.jpg)
Joins – OUTER JOIN
• Va intoarce inregistrarile care se potrivesc in ambele tabele (A si B).
SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
186
![Page 187: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/187.jpg)
Joins – LEFT EXCLUDING JOIN
• Va intoarce inregistrarile din A care nu au un match in B.
SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B ON A.Key = B.Key
WHERE B.Key IS NULL
187
![Page 188: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/188.jpg)
Joins – RIGHT EXCLUDING JOIN
• Va intoarce inregistrarile din B care nu au un match in A.
SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL
188
![Page 189: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/189.jpg)
Joins – OUTER EXCLUDING JOIN
• Va intoarce inregistrarile din A si din B care nu se potrivesc.
SELECT <select_list>
FROM Table_A A FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL OR B.Key IS NULL
189
![Page 190: Practică SGBDvcosmin/pagini/resurse... · Volumul de date •Răspunsul unei interogări depinde de mai mulți factori. Volumul de date e unul dintre ei . •Dacă o interogare merge](https://reader034.vdocuments.mx/reader034/viewer/2022050110/5f479f3fb301aa3d9817c217/html5/thumbnails/190.jpg)
190