Sunteți pe pagina 1din 14

1

IndexuricustructurdinamicarboridecutaredetipB+.Formatul
nodurilor.Algoritmidecutareideinserare.Exemple.
(textpreliminar)

Anterior conceperii structurilor dinamice de indexare n domeniul bazelor de date, una din metodele cele
mai rspndite pentru realizarea accesului la informaie a fost cea a accesului secvenial indexat (ASI).
Aceastmetod,dezvoltatiniialnmediulIBMcuinteniaextrageriirapideainformaiilormemoratede
calculatoareletipmainframe,echipatelanceputcumemoriiexternepebenzimagnetice,continufie
folositncpescarlargnsistemeledebazededate,fieelerelaionalesaunu.
MetodaASIprevedememorareasecvenialanregistrrilordefiier,ceeaceeranormalncazulfolosirii
debenzimagnetice.Extragereanregistrrilorindividualeserealizeazcuajutorulunuisistemdeindicatori
deadres(pointeri)orientaictrenregistrri.Indicatoriideadressuntmemoraintabelededispersie
(tabele hash), tabele ce poart numele de indexuri. Aceast manier de acces permite extragerea
nregistrrilorfrafinecesarunprocesdecutarenntregulvolumdeinformaie.
Pe de alt parte, vom remarca faptul c n bazele de date de tip navigaional, pointerii ctre alte
informaiieraumemoraichiarninteriorulnregistrrilordincareseiniiazprocesuldecutare.Avantajul
utilizriimetodeiASIconstnlungimearedusaindexurilori,prinurmare,ntimpulscurtdecutarela
acestnivel.nacestmod,bazadedatevaefectuaoperaiunideaccesnumailanregistrriledorite.
n contextul folosirii metodei ASI, realizarea bazelor de date relaionale impune meninerea valabilitii
legturilor ntre relaii (tabele), deziderat care se realizeaz prin mijloace logice corespunztoare. n
practic, pentru o cutare rapid, se indexeaz un element (cmp) din nregistrare (tuplu), ce poart
numele de cheie extern (strin). n aceast abordare, viteza de acces va fi mai mic dect atunci cnd
pointerii ctre datele cutate sunt depui direct n nregistrri. Pe de alt parte, modificrile n aranjarea
fizicadatelornufacnecesaractualizareapointerilor.
ntructmetodaASIconstnaccesulsecvenialdirectlafiierelebazeidedate,implementareasa,cai
nelegereaeiconceptual,nuridicproblemenmajoritateacazurilor,faptceconduceilauncostredus
al folosirii metodei. Totui, n unele situaii, ca, de exemplu, n configuraiile clientserver, fiecare sistem
client trebuie s gestioneze propria sa legtur cu fiecare fiie la care realizeaz un acces, fapt care face
posibileoperaiuniconflictualedeinseraredetuplurinacestefiierei,nconsecin,strideincoerena
bazei de date. Problema menionat este soluionat de sistemele curente de gestiune a bazelor de date,
careconinunmoduldereglementareclientserver.
Ulterior,pentrunlocuireametodeiASI,afostpropustehnicametodeideaccescumemorievirtual(IBM),
careestemetodadeaccesfiziclainformaiefolositnsistemulDB2.

2
Structuridinamicedeindex.ArboriB+.
ASI inconvenient lanuri lungi de overflow apar cnd fiierul crete, deci > performane mai slabe.
Consecin> au aprut structuri dinamice, mai flexibile, care se adapteaz uor operaiilor de inserare i
eliminare.Unadinacestestructuri:arboriidecutareB+.nesen,arboreleB+esteunarborebalansat,n
care nodurile interne direcioneaz procesul de cutare, iar nodurile frunz (terminale) conin intrrile de
date.
nmodelulASI,alocarea(adugarea)depaginifrunzsefceastatic,secvenial.ncazularborilor
B+, structura arborilor se dezvolt (crete) i se reduce n mod dinamic, deci nu este posibil ca paginile
frunzsfiealocatesecvenialstatic.Pentruaextragepaginilefrunznmodeficient(decirapid!Defapt,
este vorba de extragerea informaiilor din pagin, ceea ce presupune extragerea paginii din memoria
secundar > cea central), acestea trebuie legate (ntre ele) prin pointeri de pagin. O cale de a lega
paginileesteorganizarealornolistdublunlnuit.nacestmod,vomputeatraversasecvenapaginilor
noricedirecie.Ostructurdeacestgenmaijosnfig.1.
ASIesteostructurstatic.Incazulstructuriidimnamice:

Intrrideindex
(cutaredirect)

Intrridedate

Fig.1StructuraunuiarboreB+

Fiierindex

PrintrecaracteristicilefundamentalealearborilorB+:
- Operaiile(inserare,eliminare)meninechilibrularborelui.
- Graddeocuparedeminimum50%garantatpentrufiecarenod.Excepienodulrdcin,dacse
folosete un algoritm de eliminare specific. Remarcm, totui, c eliminarea se implementeaz
adeseaprinsimplalocalizareaintrriidedateiaeliminriiacesteia,frajustareaarborelui,aa
cum ar cere garantarea unui grad de ocupare de 50%. Cauza arborii cresc de obicei, nu se
diminueaz.
- Cutarea unei nregistrri reclam numai o traversare a arborelui de la rdcin pn la frunza
corespunztoare.nlimeaarboreluiestelungimeauneicidelardcinpnlaofrunz(pnla
orice frunz, arborele fiind echilibrat. Arborii B+ au coeficient de ramificare la ieire (fanout)
mare,deaceeanlimealoresterareori>ca3sau4.

PentruarboriiB+notm:
- d=ordinularboreluiB+,careesteomsuracapacitiiunuinodalarborelui
- m=numruldeintrrinfiecarenodpentruarboriiB+pecareistudiemaici
ngeneral,avem:d<=m<=2d.
Pentrunodulrdcin:1<=m<=2d.

Consideraiicalitative:
ngeneral,estemaiavantajossfolosimunindexcuarboreB+cunregistrridedatememorateca
intrri de date, n loc de a folosi un fiier sortat. Pentru overheadul de spaiu necesitat de memorarea
intrrilorindexului,seobinavantajelefiierelorsortate,lacareseadaugalgoritmieficienideinserarei
eliminare.Deobicei,arboriiB+asigurcca67%graddeocupareaspaiuluidememorie.
Arborii B+ sunt preferai, de obicei, indexrii ASI, deoarece asigur inserarea fr nlnuiri de
overflow.
Remarcm, totui, c dac dimensiunile i distribuirea volumului de date rmn ndeajuns de
statice, nlnuirile de overflow pot s nu constituie o dificultate. n astfel de cazuri, AIS este
recomandabil.
Regulgeneral:arboriiB+auperformanemaibunecaAIS.

Formatulunuinod
Esteacelaicuformatulunuinod(pagindeindex!)AISvezifig.2

Aici:nodurileinternecumintrrideindexconinm+1pointerictresuccesori(copii).PointerulP
i

indicspreunsubarborencaretoatevaloriledecheieKsunta..:K
i
<=K<K
i+1
.
P
0
K
1
P
1
K
2
P
2
K
m
P
m
Intraredeindex
Fig.2
fig.2
Formatul
uneipagini
deindex.

4
Cazurispeciale:
P
0
indicspreunarborencaretoateK<K
1
P
m
indicspreunarborencaretoateK>=K
m
Pentrunodurilefrunz(terminale),intrrilesuntnotateK*uzual.narboriiB+,nodurilefrunz(i
numai ele!) conin intrri de date (data entries). n cazul obinuit al folosirii alternativelor (2) i (3),
intrrile frunz sunt perechi <K, I(K)>, exact ca i intrrile interne (neterminale). Mai observm c
indiferent de alternativa aleas pentru intrrile frunz, paginile frunz sunt nlnuite n o list dublu
nlnuit. Aadar, frunzele formeaz o secven, care poate fi folosit pentru a rspunde eficient la
interogrilecareprimescintervaledevalori.
Esteinteresantdeaanalizacumsepoateajungelaoorganizareanoduluidearborecaceademai
sus, folosind alte formate de nregistrri (cu lungime fix, cu lungime variabil). De fapt, fiecare pereche
cheiepointer poate fi vzut ca o nregistrare. Dac fiierul care se indexeaz este de lungime fix a
nregistrrilor,intrriledinindexvoravealungimefix.ncazulcontrar,arfidelungimevariabil.nambele
cazuri, arborele B+ poate fi vzut el nsui ca un fiier de nregistrri. Dac paginile frunz (terminale) nu
coninnregistrrileautenticededate,atunciarboreleB+esteefectivunfiierdenregistrri,adicdistinct
de fiierul care conine datele. Dac ns paginile frunz (terminale) conin nregistrri de date, atunci un
fiierconineattarboreleB+ctidatele.

Procesuldecutare

Algoritmuldecutaregsetenodulfrunzcruiaiaparineointrarededateanumit.nceleceurmeaz
(caipentrualgoritmuldeinserareieliminarepentruarboriiB+)sepresupunecnuexistduplicate.Cu
altecuvinte,nupotexistadouintrridedatecuaceeaivaloareacheii.npractic,potapreaduplicate.

Notaiifolosite:
Ptrvariabilpointer;
*ptrvaloareactrecareindicpointerulptr
&(valoare)adresapentruvaloare

Vomremarcafaptulc,pentruagsiinprocesuldecutarenarbore,trebuiesefectumo
cutareninteriorulnodului,ceeacesepoaterealizafieprinocutareliniar,fieprinocutarebinar(n
funciedenumruldeintrrinnod).
Algoritmuldecutareprezentatnpseudocodulcareurmeaz:

funcgsete(valoareaKacheiidecutare)returnspointerdenod
//Fiinddatovaloaredecheiedecutare,gsetenodulsaufrunza
returncutarenarbore(rdcina,K);
endfunc

funccutarennod(pointerdenod,valoareKacheiidecutare)returnspointerdenod
//Cautnarborepentruintrare
if*pointerdenodesteofrunz,returnpointerdenod;
else,
ifK<K
1
thenreturncutarenarbore(P
0
,K);
else,
ifK>=K
m
thenreturncutarenarbore(P
m
,K);//m=#intrri
else,
findiastfelnctK
i
<=K<K
i+1
;
returncutarenarbore(P
i
,K)
endfunc

Fig.3Algoritmpentrucutarepseudocod

Pentruailustrafuncionarea(parcurgerea)algoritmuluidecutarefieexemplularboreluiB+din
Fig.4.Remarcmcordinularboreluiested=2,adicfiecarenodconinentre2i4intrri.Fiecareintrare
intern (nefrunz !) este conine o pereche <valoare de cheie, pointerdenod>. La nivelul frunzelor
(nodurilorterminale),intrrilesuntnregistrridedate,notatecuR*.

6

13 17 24 30

2
*
3
*
5
*
7
*
14
*
16
*
19
*
20
*
22
*
24
*
27
*
29
*
33
*
34
*
38
*
39
*

Fig.4ArboreB+deordinuld=2

Presupunem c dorim s efectum o cutare pentru intrarea 5*. n acest scop, vom urmri pointerul
succesorului(copilului)dinextremastng,deoarece5<13.Dacvomcutaintrrile14*sau15*,urmrim
al doilea pointer, deoarece 13<=14<17, iar 13<=15<17. Deoarece nu gsim n paginile frunz 15*, putem
trageconcluziacaceastvaloarenuesteprezentnarbore!Pentruagsi24*,vomfolosipointerulcelui
dealpatruleasuccesor(copil),deoarece24<=24<30.

Procesuldeinserare

Algoritmul de inserare la o intrare (din index), gsete nodul frunz cruia i aparine i insereaz
acolonregistrarea.
Ideea algoritmului de nserare st n aceea c inserm recursiv o intrare apelnd algoritmul de
inserarelanivelulnoduluisuccesor(copie)corespunztor.Deobicei,aceastprodcedurneconducejos,
lafrunzacreiaiaparineintrarea,amplasndintrareaacoloirevenindapoilanodulrdcin.
Remarcmcuneoriunnodestecomplet(plin)i,caurmare,trebuiesecionat.Atuncicndeste
secionatnodul,nprintelesutrebuieinseratointrarecarevaindicasprenodulcreatprinsecionare.
Ctre aceast intrare, la rndul su, va indica o variabila pointer numit copiinoi, sau succesori noi..
Prinsecionareavechiuluinodicreareaunuinounodrdcin,nlimeaarboreluicretecuounitate.
Pseudocodul algoritmului n Fig. 5. Pentru a ilustra procesul de inserare, vom folosi arborele
prezentatanteriorFig.4,pentruprocesuldecutare.
Admitem c dorim s inserm intrarea 8*. Aceasta aparine, evident, frunzei (nodului frunz) din
extremastngcareestedejaplin.Potrivitalgoritmului,proceduradeinserarevaefectuaosecionarea
paginiifrunz.PaginilerezultateprinsecionaresuntprezentatenFig.6.ntregularboretrebuieacum
Rdcin

7
ajustat, pentru a lua n consideraie noua pagin frunz care a aprut. n acest scop, inserm o intrare
care const din perechea <5, pointer ctre pagina nou>, n nodul printe. Aici, observm n ce nod este
copiat cheia 5, care descrie diferena ntre pagina frunz secionat i sora (sau fratele) su creat. Nu
putemcapurisimplu,smpingem(deplasm)nsus(pushup)valoarea5,deoarecefiecareintrare
dedatetrebuiesaparnopaginfrunz.
Deoarece nodul printe este, de asemenea, plin, apare o alt secionare. n general, trebuie s
secionm un nod nefrunz atunci cnd este plin i conine 2d chei i 2d+1 pointeri, respectiv trebuie s
adugmoaltintraredeindexcarescorespunduneisecionridenodcopil.Avem,nacestmoment,
2d+1cheii2d+2pointeri,cudounodurinefrunzpline(nmodminimal!!),fiecaredinacesteaconinnd
dcheiid+1pointeri.Deasemenea,maiavemocheienplus,pecareofacemcheiedemijloc(median).
Aceastcheieiunpointerctrealdoileanodnecheieconstituieointraredeindexcaretrebuieinseratn
printelenoduluinefrunzsecionat.nacestfel,cheiademijlocestempins(deplasat)sprepartea
desusaarborelui(pushedup),spredeosebiredecazulsecionriiuneipaginifrunz.
PaginilesecionatedinexemplultratatsevdnFig.7.Intrareadeindexcareindicsprenoulnod
nefrunzesteperechea<17,pointersprenouapaginlaniveldeindex>;trebuieremarcatcvaloarea17a
cheii este mpins n sus pe arbore, spre deosebire de valoarea 5 a cheii de secionare n seciunea
frunzei,careafostcopiatnparteasuperioar.

Procinsereaz(pointerdenod,intrare,copiinoi)
//Insereazointrarentrunsubarborecurdcina*pointerdenod;
//gradulested;copiinoiesteiniialnul,itotnullareturndac
//nuestesecionatunnodcopil
if*pointerdenodesteunnodnefrunz,sspunem(fie)N,
findiastfelnctKi<=valoareacheiiintrrii<Ki+1;//alegeunsubarbore
insert(Pi,intrare,copiinoi); //recursiv,insereazonregistrare
ifcopiinoiisnull,return; //cazuzual;nusasecionatnodcopil
else, //amsecionatnodulcopil,trebuieinserat*copiinoinN
ifNarespaiu,
pune*copiinoinel,punecopiinoilazero,return;
else //noteazdiferenawrtsecionareapaginiifrunz!
secioneazN://2d+1valoridecheiei2d+2pointeridenod
primeledvaloridecheieid+1pointeridenodrmn,

8
ultimeledcheiid+1pointerisedeplaseazlaunnodnou,N2;
//*copiinoipuspentruorientareacutrilorntreNiN2
copiinoi=&(<ceamaimicvaloaredecheielaN2,pointerulctreN2>);
ifNesterdcina, //rdcinaafostsecionatadineauri
creazunnodnoucu<pointerulctreN,*copiinoi>;
forezpointeruldenodalrdciniiarboreluisindicesprenoulnod;
return;
if*pointerdenodesteunnodfrunz,fieL,
ifLarespaiu //cazuzual
puneointrarenel,punecopiinoilazero,return;
else,
secioneazL:primeledintrrirmn,restulse
deplaseazsprenodulnouL2;
copiinoi=&(<ceamaimicvaloaredecheielaL2,
pointerulctreL2>);
punepointeriifrainLiL2;
return
endproc.

Fig.5,AlgoritmpentruinserarenarboreB+deordind

Diferena n tratarea secionrilor la nivel de frunz i la nivel de index, provine din cerina ca la
arboriiB+,toateintrrilededateR*sfieamplasatenfrunze.Aceastcerinnempiedicsmpingem
nsusvaloarea5iconducelaouoarredundan,avndunelevaloridecheiecareaparattlanivelde
frunz,ctilaniveldeindex.Totui,lainterogrilecaresolicitvaloripeinterval(rangequeries),se
poate rspunde eficient prin simpla extragere a secvenei de pagini frunz; redundana este un pre mic
pentru eficiena realizat. n procesul de tratare a nivelurilor de index, avem o flexibilitate mai mare, i
mpingemnsusvaloarea17,pentruaevitaprezenaadoucopiialevalorii17laniveldeindex.

9
5
2* 3* 5* 7* 8*

Intrarecareseinsereazntrunnodprinte(Denotatc5estecopiat
nsusicontinusaparinfrunz).

Fig.6Secionareapaginilorfrunznprocesul
inserriiintrrii8*

17

5 13 24 30

Intrarecareseinsereazntrunnodprinte(Denotatc17este
mpinsnsusicapreodatnindex.Devzutaceastancontrastcu
secionareauneifrunze).

Fig.7Secionareapaginilordeindexnprocesul
deinserareaintrrii8.
Rdcin

10

1
7

Rdcin

5 1
3
24 30

2
*
3
*
5
*
7
*
8
*
14
*
16
*
19
*
20
*
22
*
24
*
27
*
29
*
33
*
34
*
38
*
39
*

Fig.8ArboreleB+dupinserareaintrrii8*

Rdcin

8 17 24 30

2* 3* 5* 7* 8* 14* 16* 19* 20* 22* 24* 27* 29* 33* 34* 38* 39*

Fig.9ArboreleB+dupinserareaintrrii8*
folosindredistribuirea

n continuare, deoarece nodul de secionare a fost vechea rdcin, trebuie s crem un nod
rdcin, pentru a conine intrarea care distinge ntre ele cele dou pagini de index secionate (de
secionare).Arboreleobinutdupinserareaintrrii8*esteprezentatnFig.8.

11
O alt variant a algoritmului de inserare ncearc s redistribuie intrrile unui nod N cu un
frate(al acestuia), nainte de secionarea nodului. Pe aceast cale se poate nbunti gradul mediu de
ocupareaspaiului(dememorie!).ncontextuldeaici,unfrate(sibling)alunuinodNesteunnodaflat
imediat la stnga nodului N i avnd acelai printe ca N. Procedura de redistribuire (pe care nu o mai
descriemndetaliu)conducelarezultatuldinFig.9.
Alteprobleme:algoritmuldeeliminarecuindexcuarboreB+,cheiduplicate,arboriiB+npractic
compresiacheilor,procesulbulkloadingnarboriB+,conceptuldeordine.
ArboriiB+nsistemelereale:IBMDB2,Informix,MicrosoftSQLServer,Oracle,SybaseASEtoate
auindexuricuarboriB+clusterediunclustered.

FolosireaindexurilornOracle(SQLOracle)

Oracleare2metodedeaaccesaliniintruntabel:accessecvenialiaccesdirectcametode.
Accessecvenialdescriscelmaibinecarsfoireaunuitabellinieculinie.Oraclecitetefiecare
liniedintabel.Dacsecautdoarolinieitabelularemulteliniicutarea=ineficient,timpmult.Esteca
icumsartreceprinocartedetelefon,pagincupagin.Dacnoicautmnumruldetelefonalcuivaal
cruinumencepecuL,nuvomncepecutareadelaA!!
Cnd Oracle folosete metoda de acces direct, citete numai liniile care au anumite proprieti
cerute.Pentruaceastansestenecesarunindex.
nOracleindexulconstruitcaunarbore,formatdinnodurivezifigura:

12

2
6

7 JUCATORNO NUME
6 Paul
7 8 44 Baciu
27 27 83 Hila
44 2 Enescu
27 Colan
44 28 104 Motru
112 39 7 Scumpu
44 57 Boldea
39 Beraru
95 57 112 Barbu
112 83 8 Neagu
95 100 Panait
28 Cotru
100 95 Mihai
104

112

Fig.10

nstngastructuradeindex.ndreaptadoucoloanealeunuitabelJuctori(!!!).
Nodul din extrema stnga rdcin. Fiecare nod conine un maximum de 3 valori ordonate din
coloana JUCATORNO. Fiecare valoare ntrun nod indic spre un alt nod sau spre o linie din tabela
JUCATORI. (not n figur nu am indicat fiecare destinaie de pointer). De asemenea, observm c
fiecare linie n tabel este referit prin cel puin un nod. Un nod care indic spre o linie este pagin
frunz.
Valorile n noduri: ordonate. Pentru fiecare nod, afar de rdcin, valorile sunt totdeauna <=
valoareacareindicspreacelnod.Paginilefrunzsuntelenselelegateunelecualtele.Opaginfrunzare

13
unpointersprepaginafrunzcumulimeavecindevalori(vecin,nsensulde>).Acetiultimipointeri
culiniegroas.

Oracle2algoritmipentrulucrulcuindexuri:
- primulcautliniilencareapareovaloareparticular
- aldoilearsfoiesteprinontreagtabelsauprinoparteauneitabele,prinintermediulunei
coloaneordonate.
Maijosexemple.PrimularatcumOraclefoloseteunindexpentruaselectaolinie(tuplu)
particular.

Ex.1sgsimtoateliniilecareconinjuctorulcuno.44.
Pas1secautnrdcinaindexului.Rdcinadevinenodulactiv.
Pas2Estenodulactivopaginfrunz?Dacda>Pasul4.Dacnu>Pasul3.
Pas3Nodulactivconine44?Dacda,nodulctrecareindicaceastvaloaredevinenodactiv;apoi
ntoarcerelaPas2.
Dacnu,alegeceamaimicvaloarecareeste>44nnodulactiv.Nodulctrecareindicaceast
valoaredevinenodactiv;apointoarcerelaPas2.
Pas 4 Se caut valoarea 44 n nodul activ. Aceast valoare indic acum spre toate liniile n tabela
JUCTORI n care coloana JUCATORNO are valoarea 44. Se extrag toate aceste linii din BD, pentru
prelucrare.NOTputemaveajuctoricuacelainume,darnumerediferite.
Astfel,saugsitliniilecutatefrasersfoiprintoateliniile.Timpuldecutarecuindexeste
<<.

Ex.2extragetoijuctorii(numele)ordonaidupnumr.
Pas1Secautpaginilefrunzcuvaoloareaceamaimic.Eadevinenodactiv.
Pas2Extragetoateliniilectrecareindic(points)valoriledinnodulactiv,pentruprelucrareulterioar
eventual.
Pas3Dacexistopaginfrunzurmtoare,estefcutnodactivisecontinudelaPasul2.
Etc.,Etc.

14
Creareaindexurilor
UnindexsedefinetenOraclepeocoloansaupeocombinaiedecoloane.
Exemplu:CREATEINDEXGOLURIINDEXON
REZULTATE(NRGOLURI).
Maisus,comandadefineteunindexnumitGOLURIINDEXpecoloanaNRGOLURIaleunuitabel
REZULTATE.
Comandaajutlaointerogareca:
SELECT* *toate!
FROMREZULTATE
WHERENRGOLURI=15
nexempluldemaisus,OracleexamineaznumailiniiledinBDcaresatisfaccondiiaWHEREi
decirspunsrapid.Indexulasigurunaccesdirectlaliniiledintabelainspectat.
NOTunindexnuesteniciodatreferitexplicitncomandSELECT.

Cheiedecutare(Searchkey)
Cheiadecutareesteocoleciedecmpuri(unulsaumaimulte)alefiieruluidenregistrripentru
careseconstruieteunindex.Fiecareindexareocheiedecutareasociat.Oricesubmulimedecmpuri
poatefiocheiedecutare.
ntrun fiier index, paginile sunt organizate astfel nct s fie posibil localizarea acelor intrri din
indexcareauovaloaredatacheiidecutare.Observmcocheiedecutarenutrebuiesidentificen
modunicnregistrrile.
Alteelementeimportante:formatulpaginii,formatedenregistrri.

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