Anda di halaman 1dari 50

28.

STRUCTURI DE DATE I ACCES N BAZE DE


DATE

28.1 Stocarea datelor

O baz de date utilizeaz mai multe dispozitive de stocare a datelor.
Aceste dispozitive, numite i memorii, se deosebesc prin capacitatea lor de
pstrare, viteza lor, modul de accesare a datelor (secvenial sau direct) i,
n sfrit, prin persistena lor. Memoriile volatile i pierd coninutul cnd
sistemul este ntrerupt de la sursa de alimentare. Memoriile nevolatile, cum
sunt discurile sau benzile magnetice i pstreaz coninutul chiar i cnd
sunt decuplate de la sursa de curent electric.

Dispozitive de stocare a datelor

n general, cu ct o memorie e mai rapid cu att ea este mai
scump i, prin urmare, cu att capacitatea ei de stocare este mai redus.
Memoriile utilizate de un sistem de gestiune a bazelor de date (SGBD)
constituie o ierarhie, figura 28.1, care pornete de la cea mai mic, dar mai
eficace, la memoria mai voluminoas, dar mai lent:
memoria cache este utilizat de procesor pentru stocarea datelor
i instruciunilor;
memoria principal constituie spaiul de lucru al mainii; datele
sau programele sunt ncrcate n memoria principal, unde este
posibil tratarea lor de ctre procesor;
discurile magnetice constituie principalul periferic de tip memorie;
ele ofer o capacitate mare de stocare i permit un acces relativ
eficient la citire i scriere;
benzile magnetice sunt dispozitive ieftine, dar viteza joas de
lucru face ca s fie folosite pentru fiiere de salvare.

Procesor
Memorie cache
Memorie principal
Disc
Band magnetic
Memorie primar
(volatil)
Memorie secundar
Memorie teriar


Figura 28.1 Ierarhia de memorii

Memoria primar, care const din memoria cache i memoria
principal, asigur un acces foarte rapid la date. Actualmente, costul unui
volum de memorie principal este de 100 ori mai mare dect acelai volum
de memorie pe disc, iar banda magnetic este i mai ieftin. Dispozitivele
de stocare lent, cum sunt discurile, joac un rol important n bazele de
date, deoarece volumul de date este, de obicei, foarte mare.
Exist i alt raionament de pstrare a datelor n memoria secundar
sau teriar. n sistemele cu 32 de octei adresare, numai octei pot fi
referii direct n memoria principal, or volumul de date este mult mai mare.
32
2
O baz de date este aproape ntotdeauna pstrat pe disc i din
considerente de persisten. Cu toate acestea, datele recuperate sunt
plasate n memoria principal pentru a fi prelucrate. Pornind de la aceast
realitate, unde un mic fragment din baza de date poate sta n memoria
central, SGBD-ul trebuie, deci, s efectueze, n permanen, transferuri de
date ntre memoria principal i memoria secundar. Costul acestor
transferuri influeneaz direct performana sistemului.

Funcionarea discului magnetic

Un disc este o suprafa circular, magnetizat, capabil s
nregistreze date. Suprafaa magnetizat poate fi situat pe o singur parte
(dac discul are o singur fa) sau pe dou pri ale discului (dac discul
are fa dubl).
Discurile sunt divizate n sectoare, un sector constituind cea mai mic
suprafa de adresare. Cu alte cuvinte, se pot citi sau scrie zone noi care
ncep pe un sector i acoper un numr ntreg de sectoare. Mrimea unui
sector este, de obicei, de 512 octei.
Dispozitivul. n mod obinuit, bazele de date sunt stocate pe disc i
datele sunt transferate de pe disc n memoria principal n msura
necesitilor. Pentru a limita costul dispozitivului i mri capacitatea de
stocare, mai multe discuri sunt montate pe o ax i formeaz un pachet de
discuri. n lucru, axa i discurile sunt antrenate ntr-o micare de rotaie cu
o vitez mare, figura 28.2.
Cea mai mic unitate de date stocat pe un disc este un bit care
poate avea valoarea 0 sau 1. Biii sunt grupai cte 8 pentru a forma octei,
iar o mulime de octei formeaz, pe suprafaa unui disc, o cunun circular
numit pist. Mulimea tuturor pistelor cu acelai diametru se numete
cilindru.
Exist o mulime de capete de lectur/scriere situate la sfrit pe un
bra. Capetele se mic n grup, astfel c acestea pot fi poziionate asupra
tuturor pistelor ce constituie un cilindru. Prin urmare, toate datele unui
cilindru pot fi accesate fr a se produce vreo micare a braului, care este
o operaie mai lent. Noiunea de cilindru corespunde, deci, tuturor datelor
disponibile fr a avea nevoie de o deplasare a capetelor de lectur.
Capul de lectur nu este antrenat n micarea de rotaie. El se
deplaseaz pe un plan fixat care i permite de a se apropia sau de a se
ndeprta de axa de rotaie a discului i de a accesa o pist.
Sunt tot attea capete de lectur cte discuri sunt (de dou ori mai
mult, dac discurile sunt cu fee duble) i toate capetele sunt poziionate
respectiv pe planul lor de deplasare. n orice moment, pistele accesibile
sunt cele de pe un cilindru, ceea ce constituie o constrngere de care
trebuie s se in cont cnd se dorete optimizarea amplasrii datelor.
n fine, ultimul element al dispozitivului este controlorul care servete
drept interfa ntre pachetul de discuri i sistem. Controlorul primete, de
la sistem, cererile de citire sau scriere i le transform n micri
corespunztoare ale braului cu capete de lectur.
Controlor
Cap de citire
Date
Rotaie
Deplasare
Cilindru
Bra Pist
Blocuri


Figura 28.2 Un disc magnetic

Fiecare pist este divizat n arce numite sectoare, mrimea crora
este o caracteristic a discului. Sectoarele sunt diviziuni fizice i, de aceea,
au dimensiuni fixe. Ele sunt numerotate astfel nct sectoarele consecutive
au numere consecutive. Numrul minim de octei citii de capul de lectur
este definit de mrimea sectorului, n general, de 512 octei.
Fiecare pist este, deci, divizat n blocuri (sau pagini), care
constituie unitatea de schimb dintre disc i memoria principal. Blocul este
o diviziune logic i, prin urmare, dimensiunea lui este o mrime variabil.
Dimensiunea unui bloc poate fi setat cnd discul se iniializeaz. Atunci se
fixeaz unitatea de intrare/ieire (adic blocul) mai mare (sau egal) dect
a unui sector. Lungimea unui bloc este, de obicei, egal cu un multiplu al
lungimii unui sector. Astfel, se obin blocuri a cror lungime (tipic) este de
512 octei (un sector), 1024 de octei (2 sectoare) sau 4096 de octei (8
sectoare).
Toate lecturile sau toate scrierile pe disc se efectueaz prin blocuri.
Astfel, chiar dac o lectur nu se refer dect la 4 octei, ntreg blocul este
transmis n memoria central. Aceast caracteristic este fundamental
pentru organizarea datelor pe disc. Unul din obiectivele SGBDului este de a
face totul, nct, atunci cnd este necesar citirea unui bloc de 4096 de
octei pentru a accesa un numr de 4 octei (4092 de octei constituind
restul blocului), aceasta s se petreac ntr-un timp scurt, adic blocul,
deja, trebuie s se gseasc ncrcat n memoria central. Aceast
motivaie st la baza mecanismului de regrupare, n special, la baza
structurilor de date indexate i dispersate.
Accesul la date. Un disc este o memorie cu acces direct. Spre
deosebire de o band magnetic, de exemplu, este posibil de accesat o
unitate de date situat n orice loc pe disc, fr a avea de parcurs secvenial
tot suportul. Accesul direct se bazeaz pe o adres dat fiecrui bloc n
momentul iniializrii discului de ctre sistemul de exploatare. n general,
aceast adres este compus din trei elemente:
numrul discului n pachet sau numrul suprafeei, dac discurile
sunt cu suprafa dubl;
numrul pistei;
numrul blocului pe pist.
Citirea unui bloc, dat fiind adresa lui, se petrece n trei etape:
poziionarea capului de lectur pe pista care conine blocul;
rotirea discului i ateptarea pn n momentul cnd blocul va
trece sub capul de lectur capetele sunt fixate, discul se
rotete;
transferul blocului.
Astfel, exist trei factori care afecteaz direct viteza cu care datele
sunt transferate ntre disc i memoria principal:
timpul de cutare;
timpul de rotaie sau ateptare;
timpul de transfer.
Timpul de cutare (sau poziionare) este timpul necesar pentru a
mica braul cu capetele de lectur/scriere din poziia curent, pn n
poziia cilindrului adresat. Timpul de rotaie sau al strii latente) ( este
timpul necesar discului pentru a se nvrti pn ce capul va fi situat
deasupra sectorului de scriere sau citire. Timpul de transfer este timpul
necesar pentru citirea sau scrierea datelor. Acest timp depinde de numrul
de octei transferai. Timpul de transfer este neglijabil pentru un bloc, dar
poate deveni important cnd trebuie citite mii de blocuri. Mecanismul scrierii
este asemntor celui de citire, dar poate s consume puin mai mult timp,
n cazul cnd controlorul verific dac scrierea se efectueaz corect.

Optimizarea accesului la date

Acum cnd se cunoate cum funcioneaz un disc, este destul de
evident c, pentru acelai volum de date, timpul de lectur poate varia
considerabil, n funcie de factori precum amplasarea datelor pe disc,
ordinea instruciunilor de lectur/scriere sau prezena datelor ntr-o
memorie cache.
Toate tehnicile care permit reducerea timpului consumat pentru
accesul la disc sunt intensiv utilizate de SGBD-uri, a cror performan, n
mare parte, este condiionat de eficiena acestor accesri. n aceast
seciune, vor fi descrise principalele tehnici de optimizare, realizate ntr-o
arhitectur simpl, constituit dintr-un singur disc i un singur procesor.
Regruparea datelor. Din cele relatate mai sus, reiese c timpul de
executare a operaiilor asupra datelor n baza de date este afectat
semnificativ de faptul cum sunt stocate datele pe disc. Timpul de transfer al
blocurilor, din sau spre disc, de obicei, domin timpul consumat de
operaiile bazei de date. Pentru a minimiza acest timp, este necesar de a
alege o strategie de amplasare a datelor pe disc, innd cont att de
geometria discului, ct i de mecanica discului.
De exemplu, fie SGBD-ul trebuie s citeasc 5 secvene de caractere
a cte 1000 octei fiecare. Dac un bloc are lungimea egal cu 4096 octei,
dou blocuri sunt suficiente pentru a pstra aceste secvene de caractere.
n figura 28.3, sunt prezentate dou tipuri de organizare a unui disc. n
primul tip, fiecare secven este plasat ntr-un bloc aparte i blocurile sunt
repartizate n mod aleatoriu pe pistele discului. n cel de-al doilea tip de
organizare, secvenele sunt stocate n dou blocuri consecutive pe aceeai
pist a discului.
b) a)


Figura 28.3 a) - organizare rea; b) - organizare bun

Performanele obinute reprezint un raport de 1 la 5. Timpul minimal
se obine, apelnd la gruparea datelor. Gruparea se bazeaz pe plasarea n
acelai bloc a datelor care au anse mari de a fi citite mpreun. Criteriile
folosite la determinarea grupurilor de date constituie bazele structurilor de
date n memoria secundar.
n general, ctigul obinut la transferarea a dou date este cu att
mai impuntor cu ct datele sunt mai apropiate pe disc. Aceast
apropiere are mai multe valene.
Evident, apropierea maximal posibil este obinut cnd dou uniti
de date se gsesc n acelai bloc ele vor fi citite mpreun. Dou blocuri
sunt foarte apropiate, dac sunt stocate consecutiv pe o pist. Cu viteza
discului, dou blocuri vor fi citite sau scrise, dac se gsesc pe aceeai
pist, sub acelai cap activ de citire. Toate datele de pe o pist (pe discurile
proiectate azi) se citesc i se scriu ntr-o revoluie a discului, fr a se
deplasa capul de citire.
Dup ce o pist este citit sau scris, alt cap al discului devine activ i
alt pist a aceluiai cilindru este citit sau scris. Acest proces continu
pn cnd toate pistele de pe cilindrul curent sunt citite sau scrise, i apoi
braul n ntregime se deplaseaz (nainte sau napoi) spre cilindrul adiacent.
Astfel arat noiunea apropierea blocurilor care ntr-un sens exprim
noiunile de bloc urmtor i precedent.
Prin urmare, n descreterea ordinii, dou uniti de date pe disc
trebuie s fie n acelai bloc, pe aceeai pist, pe acelai cilindru sau pe
cilindri adiaceni.
Exploatarea noiunii de apropiere i aranjare a datelor astfel ca ele
s fie scrise sau citite secvenial este foarte important pentru reducerea
timpului consumat la accesarea discului. Ea permite lecturi secveniale care,
dup cum reiese din exemplul anterior, sunt mult mai performante dect
lecturile aleatorii, deoarece ele evit deplasarea capului de lectur i
minimizeaz timpul de cutare i stare latent.
SGBD-urile de azi optimizeaz distana dintre date n momentul
stocrii lor pe disc. De exemplu, o relaie este stocat pe aceeai pist sau,
n caz c ea ocup, pe mai multe piste, pe pistele aceluiai cilindru, pentru a
putea realiza o parcurgere secvenial eficient.
Pentru ca SGBD-ul s poat efectua aceste optimizri,
administratorul, cnd definete schema fizic a bazei de date, trebuie s
rezerve un spaiu important pe disc, pe care el (SGBD-ul) l va gestiona.
Dac SGBD-ul se mulumete de a cere sistemului de exploatare spaiu pe
disc atunci cnd are nevoie, stocarea fizic obinut poate fi extrem de
fragmentat.
Reordonarea accesului la date. Bazele de date sunt sisteme ce
lucreaz n regim de multiutilizator. Astfel, chiar dac teoretic se admite c
un fiier este stocat continuu pe aceeai pist, citirea secvenial a acestui
fiier poate fi segmentat de interogrile formulate de ali utilizatori care
acceseaz baza de date n mod concurenial. i atunci, eficiena organizrii
optimale a datelor pe disc, bineneles, scade. Apare, deci, problema ridicrii
eficienei accesului la date n situaia satisfacerii simultane a mai multor
utilizatori, cererile crora trebuie administrate concomitent.
De exemplu, dac un utilizator cere lectura fiierului , n timp ce
utilizatorul cere lectura fiierului , sistemul, probabil, va alterna
lectura blocurilor din aceste fiiere. Chiar i n cazul cnd ambele fiiere vor
fi stocate secvenial, deplasarea capului de citire va minimiza ntru ctva
avantajele acestei organizri.
1
U
1
F
2
U
2
F
SGBD-ul poate reduce acest dezavantaj prin conservarea temporar a
operaiilor de citire/scriere ntr-o zon tampon (cache) i reorganizarea
(secvenial) ordinii de acces.
Astfel, fie mai muli utilizatori formuleaz instruciuni de lectur i
scriere asupra fiierelor stocate n baza de date. Evident c multe din aceste
cereri se pot suprapune cnd trec prin controlor. Pentru a evita accesul
aleatoriu care survine n urma acestei suprapuneri, cererile de acces sunt
stocate temporar ntr-un tampon. Sistemul le triaz, atunci, pe piste, apoi
pe blocuri n cadrul fiecrei piste i apoi transmite lista ordonat
controlorului de disc.
O metod de sistematizare a acestei strategii este aa-zisul
ascensor. Adic se presupune c capul de lectur se deplaseaz de la
marginea suprafeei discului spre axa de rotaie, apoi revine de la ax spre
bord. Deplasarea se efectueaz pist dup pist i, la fiecare pist, sistemul
transmite controlorului cererea de citire/scriere corespunztoare pistei
curente.
Acest algoritm reduce la maximum timpul de deplasare a capului,
deoarece cutarea se realizeaz sistematic pe pistele adiacente. El este, n
particular, eficient pentru sistemele cu multe cereri, fiecare antrennd mai
multe blocuri de date. Dar, bineneles c pot fi i unele efecte nedorite n
cazul unor cereri mari consumatoare de date. Procesele care cer blocuri de
pe pista 1, cnd capul, deja, trece pe pista 2, trebuie s atepte un timp
considerabil pentru a vedea cererea dat satisfcut.
Utilizarea memoriei tampon. Utilizarea memoriei tampon sau a
buferului pentru optimizarea accesului la date este pe larg practicat n
toate SGBD-urile. O memorie tampon este o mulime de blocuri n memoria
principal, care sunt copii ale unor blocuri de pe disc. Cnd sistemul cere
accesul la un bloc, mai nti se inspecteaz memoria tampon. Dac blocul se
gsete n bufer, este evitat o citire a dispozitivului secundar de stocare a
datelor. Dac nu, se efectueaz lectura i se stocheaz blocurile n memoria
tampon.
Ideea este, deci, de a pstra n memoria principal o copie a unei
pri ct se poate de mare a bazei de date, chiar dac o parte din blocurile
plasate n memoria tampon nu este util la moment. O latur important a
administrrii unei baze de date o constituie specificarea unei pri de
memorie principal n calitate de memorie tampon disponibil, n
permanen, SGBD-ului. n plus, aceast memorie este util i prin faptul c
se poate conserva o parte semnificativ a bazei, ctignd, astfel, n
performan.
Dac n memoria tampon rmne loc neutilizat, se poate recurge la
lecturi n avans. Tehnica lecturii n avans este utilizat frecvent de SGBD-uri
pentru a efectua operaia de jonciune a dou relaii. Aceast tehnic se
folosete pe larg i n lucrul cu fiierele indexate.


28.2 Concepte generale de organizare a fiierelor

O baz de date este conceput ca o mulime de fiiere stocate pe un
suport persistent. nainte de a vorbi despre conceptele fundamentale ale
structurilor de fiiere n baze de date, trebuie menionat, pentru a elimina
confuzia, c aceste dou concepte (fiier i fiier n baza de date) sunt dou
noiuni distincte. n primul rnd, fiierele administrate de un SGBD sunt un
pic mai structurate. Dar, de fapt, exist trei particulariti eseniale care
caracterizeaz fiierele din baze de date. Aceste particulariti sunt:
viziuni diferite ale acelorai date;
independena date-prelucrare;
redundana (gestionabil) datelor.
De aceea, fr excepie, SGBD-rile au propriile lor module de
gestiune a fiierelor i a memoriei cache.

Cmpuri i nregistrri

Cnd se construiesc structuri de fiiere, datelor li se d un aspect
organizaional i de persisten n acelai timp, adic o aplicaie creeaz, n
memoria central, date i le salveaz ntr-un fiier i cel puin o alt
aplicaie poate citi i rescrie aceste date n memorie, recuperndu-le din
fiier. Astfel, obiectivul este organizarea datelor ntr-o structur
comprehensibil de ctre fiinele umane. Or, pentru un sistem de operare,
fiierul este o succesiune de octei repartizai n unu sau mai multe blocuri.
Prin urmare, se disting nivelul logic i nivelul fizic de concepere a
fiierului:
structura logic este forma fiierului n care este vzut i
manipulat de aplicaii; cum datele sunt organizate n aplicaii (n
general, organizate n acord cu obiectele pe care aplicaia le
manipuleaz); de exemplu, un fiier poate fi vzut ca o colecie
de entiti ordonate de o cheie sau o structur ierarhic construit
din entiti principale i entiti subordonate;
structura fizic este o viziune care reflect reprezentarea i
organizarea datelor n mediul de stocare (sectoare, blocuri,);
este forma n care datele sunt stocate, organizate pe dispozitiv,
innd cont de unitatea de baz pe care dispozitivul o poate
manipula (o comand de citire sau de scriere o manipuleaz n
ntregime).
La nivel fizic, fiierele sunt constituite din nregistrri (records) care
reprezint, din punct de vedere fizic, entitile de lucru ale SGBD-ului.
Conform modelului logic al SGBD-ului, aceste entiti pot fi tupluri ntr-o
relaie sau obiecte. n cele ce urmeaz, este tratat primul caz, adic este
considerat modelul relaional de date.
Cmpuri cu lungime fix i lungime variabil. Un tuplu al unei relaii
este constituit dintr-o list de componente (atribute), fiecare avnd un tip.
Acestui tuplu i corespunde, la nivel fizic, o nregistrare, constituit din
cmpuri (field). Fiecare tip de atribut determin lungimea cmpului necesar
pentru stocarea unei instane a cmpului.
Lungimea unui tuplu este egal cu suma lungimilor cmpurilor care
reprezint atributele sale. n practic, lucrurile sunt ceva mai complicate.
Cmpurile (i, deci, nregistrrile) pot fi de lungimi variabile. Dac lungimea
unei nregistrri de mrime variabil crete pe parcursul actualizrii, trebuie
s se gseasc un spaiu liber. De asemenea, apare i problema
reprezentrii valorii NULL.
Tipurile de date pot fi divizate n dou categorii: tipuri care pot fi
reprezentate printr-un cmp de lungime fix i tipuri care au lungime
variabil. De exemplu, standardul SQL2 propune, printre altele, dou tipuri
de date pentru secvene de caractere: CHAR i VARCHAR.
Tipul CHAR indic o secven de lungime fix. Astfel, CHAR(5)
definete un cmp stocat pe 5 octei. Atunci apare ntrebarea: cum se
reprezint valoarea Joc? Exist dou soluii:
ultimele dou caractere se completeaz cu spaii;
ultimele dou caractere se completeaz cu un caracter
convenional.
Convenia adoptat influeneaz compararea, fiindc, ntr-un caz, se
stocheaz Joc (cu 2 spaii), iar n alt caz - Joc fr caractere de
terminaie. Dac se utilizeaz tipul CHAR, este important s se studieze
convenia adoptat de SGBD-ul concret.
Tipul VARCHAR(n) permite stocarea secvenelor de lungime variabil.
Exist (cel puin) dou posibiliti:
cmpul este de lungimea n+1, primul octet conine un ntreg care
indic lungimea exact a secvenei; dac se stocheaz Joc ntr-
un VARCHAR(10), se obine atunci 3Joc, unde primul octet
pstreaz un 3 n form binar, urmat de trei octei cu caracterele
J, o i c, iar urmtorii 7 octei rmn neutilizai;
cmpul are lungimea l+1, unde l<n, aici nu sunt octeii neutilizai,
ceea ce permite economisirea spaiului.
De notat c reprezentarea unui ntreg de un octet limiteaz lungimea
maximal a unui VARCHAR cu 255. O variant care poate depi aceast
limit const n nlocuirea octetului iniial care indic lungimea cu un
caracter de terminare a secvenei (fie un C).
Antetul nregistrrii. La fel cum se prefixeaz un cmp de lungime
variabil cu lungimea sa util, n antetul nregistrrii se stocheaz unele
date complementare. Aceste date pot fi:
lungimea nregistrrii, dac lungimea este variabil;
un pointer spre schema relaiei, pentru a ti care este tipul
nregistrrii;
data ultimei actualizri etc.
Acest antet, de asemenea, se poate utiliza pentru indicarea valorilor
NULL. Absena valorii pentru unul dintre atribute este o problem delicat.
Dac nu se stocheaz nimic, exist riscul s fie perturbat decuparea unui
cmp, n timp ce, dac se stocheaz o valoare convenional, se pierde
spaiu. O soluie posibil este o masc de bii, cte unul pentru fiecare cmp
al nregistrrii. Bitul ia valoarea 0, dac cmpul este NULL i 1 dac nu.
Aceast masc poate fi stocat n antetul nregistrrii i, deci, nu este
necesar spaiu pentru valoarea NULL. Totul rmne n decodarea corect a
secvenei de octei.
De exemplu, fie o schem relaional cu atributele ID de tipul
INTEGER, Nume_Prenume de tipul VARCHAR(50) i An_nastere de tipul
INTEGER i fie n aceast relaie este nregistrarea (202315, Odobescu,
Alexandru, NULL), adic anul naterii este necunoscut.
Identificatorul ID este stocat pe 4 octei i numele i prenumele pe 8
octei, dintre care un octet este rezervat pentru lungimea cmpului. Antetul
nregistrrii conine un pointer spre schema relaiei, lungimea sa total (4+8), i o
masc de bii 110 care indic faptul c al treilea cmp are valoarea NULL. Figura
28.4 reprezint aceast nregistrare. De notat, c citind antetul, se poate calcula
adresa nregistrrii urmtoare.
antet ID Nume, Prenume

12 110 202315 Odobescu, Alexandru
|
pointer


Figura 28.4 O nregistrare cu antet

Blocuri

Unitatea de transfer de date ntre fiierul memorat pe mediu i
memoria intern este blocul. Lungimea unui bloc este, de obicei, o putere a
lui 2 cuprins ntre i octei. Un bloc n sistemul Oracle, de exemplu,
ocup 4096 sau 8092 octei. Fiecrui bloc i se asociaz o adres.
9
2
12
2
Structura blocului. Stocarea nregistrrilor ntr-un fiier trebuie s in
cont de divizarea n blocuri a acestui fiier. n general, ntr-un bloc se pot
plasa mai multe nregistrri, dar se evit ca o nregistrare s se mpart
ntre dou blocuri. Numrul maximal de nregistrri de lungimea L
memorate ntr-un un bloc de lungimea B este B/L, unde notaia x
desemneaz cel mai mare ntreg inferior lui x.
De exemplu, fie un fiier memoreaz o relaie a crei schem nu
conine atribute de lungime variabil, adic nu utilizeaz tipurile VARCHAR
sau BIT VARYING. nregistrrile au, deci, o lungime egal cu suma
lungimilor tuturor cmpurilor. Fie c aceast lungime este de aproximativ
84 octei, iar lungimea blocului este de 4096 octei. n afar de aceasta, fie
c fiecare bloc conine un antet de 100 octei pentru a stoca datele despre
spaiul liber disponibil n bloc, nlnuirea cu alte blocuri etc. Atunci, se pot
memora (4096-100)/84=47 nregistrri ntr-un bloc. De notat c n fiecare
bloc rmn 3996-(47*84)=48 octei neutilizai.
Transferul, n memorie, al nregistrrii 563 a acestui fiier este simplu
de efectuat: se determin n ce bloc se gsete ea (fie 563/47+1=12), se
ncarc al 12-lea bloc n memoria central i din acest bloc se extrage
nregistrarea. Prima nregistrare a blocului este 11*47+1=518, iar ultima
nregistrare este 12*47=564. nregistrarea 563 este, deci, penultima n
blocul cu numrul intern 46, figura 28.5.

fiierul F
1
12

nregistrri
antetul
blocului
46
blocuri

Figura 28.5 Un fiier cu blocuri i nregistrri

Calculul de mai sus arat cum se poate localiza fizic o nregistrare:
prin fiierul ei, apoi prin blocul ei, apoi prin poziia ei n bloc. Dac fiierul e
nominalizat cu , adresa nregistrrii poate fi reprezentat prin F1.12.46.
1
F
Exist multe alte metode de adresri. Dezavantajul utilizrii adreselor
fizice, de exemplu, este c nu se poate schimba locul unei nregistrri fr a
genera adresri invalide ale pointerilor asupra acestei nregistrri (de
exemplu, n indeci).
Pentru a permite deplasarea nregistrrilor, se poate forma o adres
logic, ce ar identifica o nregistrare independent de locaia ei. Un tabel de
coresponden permite administrarea asocierii ntre adresa fizic i adresa
logic, figura 28.6. Acest mecanism face ca organizarea i reorganizarea
bazei de date s fie o procedur flexibil. Acum e suficient referirea unei
nregistrri prin adresa sa logic, iar modificarea adresei fizice n tabel s se
efectueze cnd are loc o deplasare. n schimb, aceast metod necesit un
cost suplimentar pentru c, sistematic, trebuie examinat tabelul de
coresponden pentru a accesa datele.

F
1
12

46
Adres logic Adres fizic
#395672 F1.12.46


Figura 28.6 O adresare indirect

O soluie intermediar este mbinarea adresrilor logic i fizic.
Pentru a localiza o nregistrare se indic adresa fizic a blocului, apoi n
blocul propriu-zis se administreaz un tabel care d localizarea n bloc sau
eventual n alt bloc.
Fie, din nou, nregistrarea F1.12.46. Aici F1.12 indic blocul 12 al
fiierului . Se presupune c 46 este identificatorul logic al nregistrrii
administrate n interiorul blocului. Figura 28.7 prezint aceast adresare n
dou niveluri: n blocul F1.12, nregistrarea 46 corespunde unei amplasri n
acelai bloc, pe cnd nregistrarea 57 este plasat n alt bloc.
1
F

16 46 57
Blocul E1.12
nregistrri
Spaiu liber
Antet
readresare


Figura 28.7 O mbinare a adresrilor logic i fizic

Trebuie menionat c spaiul liber din bloc este situat ntre antetul
blocului i nregistrri. El permite mrirea simultan a acestor dou
elemente n cazul unei inserri, de exemplu, fr efectuarea reorganizrii
interne a blocului. Acest mod de identificare ofer multe avantaje i permite
reorganizarea suplimentar a spaiului intern al unui bloc.
Blocuri cu nregistrri de lungime variabil. O relaie care e definit pe
atribute de tipul VARCHAR sau BIT VARYING este reprezentat prin
nregistrri de lungime variabile. Cnd o nregistrare este inserat ntr-un
fiier, lungimea se calculeaz nu dup tipul de atribute, ci dup numrul
real de octei necesari reprezentrii valorilor atributelor. Aceast mrime
trebuie stocat la nceputul nregistrrii curente, pentru ca SGBD-ul s
poat determina nceputul nregistrrii urmtoare.
Se poate ntmpla c nregistrarea este actualizat, adic este
modificat valoarea unui atribut sau unui atribut iniial i-a fost dat valoarea
NULL. n acest caz, se poate ntmpla ca locul rezervat iniial s fie
insuficient pentru noile date i, deci, nregistrarea urmeaz s fie memorat
n alt loc al aceluiai fiier. Astfel, e necesar crearea unei legturi ntre
nregistrarea anterioar i curent, memorat n alt bloc.
La locul deplasrii nregistrrii ntregi, unele SGBD-uri aplic tehnica
de fragmentare a nregistrrii i de memorare n alt bloc a unui fragment,
organiznd, bineneles, o nlnuire la nivel de nregistrare. Deplasarea (sau
fragmentarea) nregistrrilor de lungime variabil, evident, influeneaz
eficiena de accesare a datelor. n afar de aceasta, nregistrrile de
lungime variabil sunt ceva mai complicat de administrat dect cele de
lungime fix. n schimb, un fiier care conine nregistrri de lungime
variabil utilizeaz, frecvent, mai puin spaiu dect i se atribuie.

Chei

Dac fiierul stocat este organizat ca un grup de nregistrri
secveniale, trebuie s fie forme de recuperare a unei nregistrri specifice,
executnd un numr minimal de accesri. Astfel, nregistrrile trebuie s fie
ordonate pentru acelai criteriu de cutare. Pentru aceasta, fiecrei
nregistrri i se asociaz o cheie bazat pe coninutul su pentru a fi
utilizat pentru identificarea univoc. n acest context, cheia este un
instrument conceptual important pentru meninerea consistenei datelor i
pentru asigurarea procesului de restabilire. De exemplu, cheia n fiiere este
mai bine de folosit mpreun cu unele tehnici de cutare speciale (binar, pe
blocuri etc), n baza valorii ei, pentru a verifica nregistrrile n mod
secvenial.
O cheie primar reprezint unul sau mai multe atribute, care, univoc,
identific (una i numai una) o nregistrare.
O cheie secundar nu identific univoc o nregistrare i poate fi
utilizat pentru cutarea simultan a mai multor nregistrri cu aceeai
valoare a cheii. Astfel, definiia cheilor secundare trebuie s foloseasc unul
sau mai multe cmpuri cu o semnificaie pentru utilizator i a cror date
sunt, de obicei, folosite pentru cutarea datelor n fiier. Deci, este o cheie
de ordonare pentru recuperarea unei mulimi de date, organizate diferit de
organizarea cheii primare.
Pe parcursul acestui capitol, se vor utiliza i alte noiuni legate de
cheie. Urmeaz o explicare a acestor concepte:
O cheie compus este o cheie format din mai multe atribute sau
cmpuri.
O cheie extern este o mulime de atribute care constituie cheia
primar a altui fiier. Mulimea de valori a cheii externe constituie o
submulime a mulimii de valori ale cheii primare.
O cheie de acces este cheia utilizat pentru identificarea
(recuperarea) unei nregistrri. Aceasta reprezint unul sau o mulime de
atribute pentru cutarea nregistrrilor n fiier.
Un argument de cutare este valoarea cheii de acces la nregistrare
ntr-o operaie de cutare.
O cheie de ordonare reprezint o mulime de atribute folosite la
ordonarea nregistrrilor unui fiier.
O cheie a unei nregistrri este valoarea cheii primare pentru aceast
nregistrare.
Accesul la datele stocate pe un suport periferic, spre deosebire de
aplicaiile care manipuleaz datele n memoria central, reprezint una
dintre particularitile eseniale ale SGBD-urilor. Aici apar probleme de
mbuntire a performanei, deoarece timpul de citire a unei uniti de date
pe un disc este considerabil mai mare dect timpul de acces n memoria
principal. Organizarea datelor pe un disc n fiiere, structurile de indexare
i algoritmii de cutare utilizai constituie aspecte foarte importante ale
SGBD-urilor. Un sistem performant trebuie s utilizeze eficient tehnicile
disponibile n scopul micorrii timpului de acces.
Organizarea fiierelor este o aranjare a unui tip de structur
construit astfel nct s furnizeze un mediu eficient pentru stocarea i
manipularea datelor n memoria secundar, economisind spaiul utilizat, i
mrind viteza de acces (minimiznd timpul total de accesare i transfer al
blocurilor de date) la nregistrrile din fiier. n organizarea fiierelor, se
ine cont de mai muli factori, cum sunt frecvena cu care se efectueaz
anumite operaii, cmpurile implicate n operaiile de cutare (cheile de
cutare), dimensiunile nregistrrilor (fixe sau variabile).
Cele mai utilizate tipuri de organizare a fiierelor n bazele de date
sunt: secvenial, indexat secvenial, indexat i cu dispersie. Aceste tipuri de
organizare a fiierelor sunt descrise n continuare.


28.3 Fiiere secveniale

Prin natura lor, fiierele secveniale sunt asociate dispozitivelor cu
acces secvenial, precum sunt, de exemplu, benzile magnetice. Ele se
caracterizeaz prin prelucrarea n lot, mari volume de date, costuri
minimale, spaiu redus de pstrare, utilizare n benzile magnetice. Uneori,
fiierele secveniale sunt stocate i pe dispozitive cu acces direct, n
particular, cnd este necesar prelucrarea datelor, n mod secvenial, cu o
vitez mai nalt.
ntr-un mediu multiutilizator, cum este baza de date, trebuie inut
cont c mai muli utilizatori pot partaja acelai dispozitiv de stocare i
accesul la o nou nregistrare, de obicei, necesit o poziionare nou a
capului de citire/scriere pe cilindrul care o conine. n afar de aceasta,
timpul de micare a capului de citire depinde de schema memoriei
intermediare utilizate i de faptul dac sistemul realizeaz sau nu citirea
anticipat.
Utilizarea acestui tip de organizare se recomand pentru fiierele
mici i n cazul cnd nu sunt frecvent modificate. De exemplu, n fiierele
pentru salvare, exist puine includeri de date i, n general, ele sunt fcute
n lot, periodic. Modificrile i suprimrile sunt puine sau absente.
Consultrile, evident, sporadice, pot fi fcute rapid, iar parcurgerea
secvenial este cea dezirabil.

Fiiere secveniale ordonate

Fiierele secveniale ordonate reprezint o structur de fiiere
secveniale, unde nregistrrile sunt clasificate de valorile cmpurilor care
formeaz cheia de sortare (de obicei, cheia primar) i stocate astfel nct
ordinea logic coincide cu ordinea fizic. Fiierele secveniale sunt stocate
pe disc n blocuri pe poziii fizice continue pe pistele unuia i aceluiai
cilindru i apoi pe pistele cilindrului adiacent. Deoarece nregistrrile n
fiierele secveniale sunt stocate n succesiune continu, accesarea
nregistrrii n a fiierului presupune c cele (n-1) nregistrri (ncepnd cu
prima), de asemenea, sunt citite.
Dup cum fiierele sunt unice i cheia de ordonare este unic (fiecare
instan poate fi clasificat numai ntr-un singur mod). n cazul cnd
fiierele secveniale nu posed chei de organizare (ceea ce, n bazele de
date, nu are loc), nregistrrile sunt aranjate n serie, fiindc, n general,
fiecare nregistrare nou se plaseaz la sfritul fiierului. n aceast
situaie, se adaug un cmp suplimentar care conine ordinea sau numerele
de identificare conform crora fiierul este ordonat i acest cmp poate fi
considerat cheie primar.
Organizarea secvenial este mai perfect dect organizarea serial a
fiierelor (heap file), dar ele pierd din flexibilitate, deoarece nu se adapteaz
uor la operaiile de modificare. Fiierele secveniale sunt utile pentru
clasificarea i accesarea volumelor mari de date i, din motive economice, n
general, sunt stocate pe benzi magnetice.
Fiierele sunt ordonate fizic i, pe parcursul perioadei de pstrare a
datelor, aceast ordine (logic i fizic) trebuie meninut.
Fiierul secvenial stocat pe band magnetic poate fi deschis ca un
fiier de ieire sau de intrare. Dar, dac fiierul este stocat pe disc, poate fi
deschis pentru intrare, ieire i modificare. Dac se deschide un fiier
secvenial, capul de citire ntotdeauna este fixat pe prima nregistrare a
fiierului i de multe ori (pe band, de exemplu) nu are cum s se ntoarc
la nregistrarea citit anterior. Pentru aceasta, fiierul trebuie s fie nchis
pentru a fi rebobinat banda magnetic i apoi deschis.
De obicei, fiierul secvenial este simplu de nchis, dar, pentru banda
magnetic, operaia respectiv presupune rebobinarea ei pn la nceputul
fiierului. Aceast sarcin este o funcie fizic realizat n mod automat.
Operaia de acces la un fiier secvenial poate s se produc sub dou
forme: cu cheia de acces diferit de cheia de ordonare i cu cheia de acces
egal cu cheia de ordonare.
Manipularea nregistrrilor n ordinea stocrii este eficient, deoarece
ele sunt stocate fizic n ordinea n care sunt solicitate secvena fizic este
egal cu cea logic. Accesul secvenial (const n obinerea nregistrrii care
urmeaz dup ultima accesat, n secvena (de obicei, ascendent) definit
de cheia de ordonare. n acest mod, dac se folosesc tehnicile de buferizare
i caracteristicile blocului, n majoritatea accesrilor, nregistrarea dezirabil
deja va fi n memorie, deoarece nregistrarea succesiv va fi n acelai bloc
cu precedenta. Astfel, parcurgerea secvenial dup cheia de ordonare este
simpl, ntruct fiierul se parcurge de la nceput la sfrit. ns,
parcurgerea secvenial dup alt cheie va necesita o ordonare prealabil
ntr-un fiier auxiliar.
Avantajul principal al acestei organizri este facilitatea de realizare a
operaiei de parcurgere secvenial, n afar de simplitatea implementrii
celorlalte operaii. Cel mai mare dezavantaj este timpul de executare a
operaiilor de includere i excludere a nregistrrilor, pentru c multe
nregistrri sunt deplasate pentru pstrarea ordinii fizice i logice.
Accesul aleatoriu, interogare, este caracterizat de identificarea
nregistrrii prin specificarea argumentului de cutare. Secvena de acces
nu este legat neaprat de ordinea fizic a fiierului, avnd ca rezultat
nregistrri care nu sunt stocate n form continu. n general, consultarea
aleatorie a unei singure nregistrri dup cheia de ordonare se realizeaz
prin folosirea tehnicilor de cutare mai eficiente, precum cea binar. n
cutarea binar, numrul maximal de comparaii, pentru a atinge
nregistrarea cutat, este 1 ) (log
2
+ n , unde n este numrul de nregistrri
ale fiierului.
Utilizarea principal a fiierelor secveniale este legat de prelucrarea
secvenial a datelor. Avantajul posibilitii accesrii rapide a nregistrrilor
n form continu devine un dezavantaj, dac fiierul este utilizat pentru
accesarea unei nregistrri care nu este una urmtoare sau dac atributul
de cutare nu este cheie de ordonare. Parcurgerea va fi lent, crend
impresia c fiierul nu este ordonat, necesitnd o cutare exhaustiv i
citind, n medie, jumtate de fiier pentru a gsi nregistrarea specificat.
Astfel, n general, procesarea unui fiier secvenial se face conform modului
de organizare a acestuia, adic, predomin procesarea secvenial.
Prin urmare, dac cheia de acces este diferit de cea de cutare,
atunci fiierul este unul serial n care se realizeaz o cutare secvenial,
pornind de la prima nregistrare, pn cnd se localizeaz cea cu valoarea
cheii de acces egal cu argumentul de cutare sau se atinge extremitatea
fiierului, adic nregistrarea cutat nu se gsete n fiier. Cnd cheia de
acces este egal cu cheia de ordonare exist dou alternative:
pentru dispozitive cu acces secvenial fiierele sunt citite
secvenial pn cnd exist nregistrri pentru examinare i cheia
de cutare este mai mic dect valoarea atributului cheie sau
pn cnd nregistrarea cutat este gsit;
pentru dispozitive cu acces direct sunt utilizate tehnici mai
eficiente, precum cutarea binar, prin blocuri sau interpolare.
Consultarea cu cheia de acces diferit de cheia de ordonare.
Consultarea cu cheia de acces diferit de cheia de ordonare are loc ca n
fiierele neordonate. Cutarea este fcut prin lectura exhaustiv pn cnd
se localizeaz nregistrarea cutat sau se termin fiierul. Aici NMC =
(n+1)/2, unde NMC este numrul mediu de comparaii, iar n numrul de
nregistrri n fiier. Algoritmul poate fi urmtorul:

1. Se merge la poziia iniial a fiierului.
2. Pn cnd nu este atins sfritul fiierului:
a) dac nregistrarea curent = nregistrarea dorit, terminare cu
succes;
b) avansare cu o nregistrare.
3. Terminare cu eec.

Consultarea cu cheia de acces egal cu cheia de ordonare.
Consultarea cu cheia de acces egal cu cheia de ordonare (sau cu partea ei
iniial) a fiierului stocat pe un dispozitiv cu acces secvenial se face cu o
cutare secvenial. Singurul avantaj este c, dac nregistrarea curent are
valoarea cheii mai mare dect a celei cutate, ea nu exist i cutarea este
ntrerupt. Dac, ns, dispozitivul permite accesul direct, se poate realiza o
cutare mai eficient, cum ar fi cutarea binar i atunci NMC= 1 ) (log
2
+ n
Algoritmul de cutare binar este urmtorul:

1. Definirea P
i
(poziia primei nregistrri a fiierului) i P
f
(poziia ultimei
nregistrri a fiierului).
2. Pn cnd (P
i
s P
f
) se face:
a) calcularea P
m
(poziia medie) = (P
i
+ P
f
)/2;
b) se trece la poziia P
m
;
c) dac nregistrarea curent P
m
=nregistrarea cutat, terminare cu
succes;
d) dac nregistrarea curent P
m
>nregistrarea curent, P
i
= P
m
+ 1;
e) dac nregistrarea curent P
m
<nregistrarea curent, P
f
= P
m
- 1;
3. Terminare cu eec.

Inserarea nregistrrilor. Inserarea unei nregistrri n timp real are
un cost nalt, deoarece trebuie efectuat reordonarea fiierului dup cheia
de ordonare. Pentru aceasta, se determin poziia adecvat a nregistrrii
noi (conform cheii primare), se deplaseaz toate nregistrrile care posed
cheia mai mare dect a celei incluse, se insereaz nregistrarea nou.
Algoritmul de inserare a nregistrrii

1. Se merge la sfritul fiierului.
2. Pn cnd argumentul de cutare nu este mai mare dect valoarea
respectiv a nregistrrii curente i nu s-a ajuns la nceputul
fiierului:
a) se deplaseaz nregistrarea cu o poziie (poziia nou=poziia
anterioar+1);
b) se trece la nregistrarea vecin (se micoreaz cu o poziie).
3. Se insereaz nregistrarea nou n fiier.

O alternativ pentru inserarea unei nregistrri poate fi urmtorul
algoritm: se creeaz un fiier auxiliar i se copiaz fiierul original, plasnd
nregistrarea nou n poziia corect, se suprim fiierul original i se
renumete fiierul auxiliar cu numele fiierului original.
ns, pentru fiierele mari, stocate pe suport extern, aceste procese
au un cost prohibitiv. De obicei, se utilizeaz un fiier auxiliar care conine
nregistrrile noi, ordonate n acelai mod (dup aceeai cheie) ca i fiierul
principal de date. Dar utilizarea fiierului auxiliar influeneaz procesul de
realizare a tuturor operaiilor care trebuie efectuate asupra ambelor fiiere
i nu numai asupra unuia. Toate accesrile nregistrrilor, care sunt
realizate pentru toate operaiile, trebuie s fie executate n dou fiiere.
Suprimarea nregistrrilor. Suprimarea sau eliminarea nregistrrii
trebuie fcut la nivel fizic, cu reorganizarea fiierului n timpul executrii
operaiei. Suprimarea presupune urmtoarele activiti:

1. Se merge la nceputul fiierului.
2. Se localizeaz nregistrarea care trebuie exclus.
3. Se trece, una dup alta, fiecare nregistrare de dup nregistrarea ce
urmeaz a fi suprimat i se micoreaz poziia ei cu 1.

O alternativ, de asemenea, poate fi utilizarea unui fiier auxiliar. n
acest caz, se trece la nceputul fiierului, se copiaz nregistrrile de pn la
cea care trebuie suprimat, se ignor nregistrarea care trebuie exclus, se
copiaz nregistrrile rmase n fiierul auxiliar, se substituie fiierul iniial
cu cel auxiliar.
Excluderea fizic, deci, necesit un cost prohibitiv pentru prelucrare
n timp real, deoarece trebuie deplasate toate nregistrrile care urmeaz
dup cea suprimat. Prelucrarea poate fi fcut n lot, dac operaiile pot fi
realizate mai trziu, adic comenzile de excludere pot fi colectate ntr-un
fiier de tranzacii pentru realizarea lor ulterioar. De multe ori, aceast
procedur nu poate fi acceptat. Mai frecvent este procedura care
presupune includerea n nregistrare a unui cmp adiional, n care se indic
excluderea. Astfel, pentru a elimina o nregistrare se modific doar valoarea
acestui cmp (modificarea nregistrrii), prin care se arat c ea a fost
eliminat. Cu aceast procedur, este evitat necesitatea deplasrii altor
nregistrri pentru completarea spaiilor eliberate n urma eliminrii.
Modificarea nregistrrilor. Modificarea unei nregistrri presupune
modificarea valorilor unor cmpuri ale nregistrrii. Pentru aceasta,
nregistrarea este localizat, citit, cmpurile ei sunt modificate i apoi ea
este scris. n general, sunt actualizate numai atributele care nu fac parte
din cheie. Dar, dac nregistrarea are lungimea variabil i modificarea
mrete lungimea ei, nregistrarea nu poate fi nscris n poziia iniial,
deoarece lipsete spaiul necesar. Atunci, de obicei, ea este exclus i apoi
inclus, dar, deja, actualizat.
Dac se modific vreun atribut al cheii de ordonare, schimbarea
valorii lui implic schimbarea poziiei nregistrrii. n acest caz, operaia
este, n general, implementat prin excluderea nregistrrii vechi, urmat de
includerea n poziia respectiv a variantei modificate. ns, n majoritatea
aplicaiilor, nu este permis modificarea cheii. n alte aplicaii poate fi folosit
un fiier de tranzacii. Dac este utilizat banda magnetic, operaia de
rescriere poate fi executat doar mai trziu, ntruct nu poate fi rescris o
nregistrare care este citit.
Lectura exhaustiv a nregistrrilor. Lectura exhaustiv a
nregistrrilor este o operaie eficient, deoarece const n citirea fiecrei
nregistrri din fiier. Cea mai adecvat organizare pentru acest tip de
operaii este cea secvenial.
n general, dac numrul de operaii de actualizare a fiierului este
foarte mare, se poate utiliza una din opiuni: un fiier auxiliar adiional cu
actualizri care vor fi fcute mai trziu (procesul batch); inserarea la
sfritul fiierului i reorganizarea (ordonarea) ulterioar a lui.

Fiiere secveniale ordonate la nivel logic de pointeri

Tehnicile descrise anterior ofer avantaje n cazul prelucrrii
secveniale i n cazul cutrii nregistrrilor cu metode mai rapide de
cutare. ns dezavantajul lor este timpul cheltuit n operaiile de
actualizare (includere, excludere i modificare a atributelor utilizate n
ordonarea fiierului). Aceasta se datoreaz faptului c fiierele trebuie
reorganizate n toate operaiile de includere/excludere, deplasnd
nregistrrile pentru a menine ordinea fizic egal cu cea logic. Prin
urmare, deoarece au un cost nalt, pentru includerea, modificarea i
excluderea nregistrrilor, trebuie propuse tehnici mai eficiente.
Fiierul secvenial cu pointeri a fost elaborat pentru a mri eficiena
sistemelor cu multe inserri i suprimri, cum sunt, de exemplu, bazele de
date. Structura unui fiier cu pointeri este similar unei liste nlnuite. n
acest caz, nu este necesar a avea o ordine fizic a fiierului egal cu ordinea
logic. Aceast tehnic, dei are dezavantajul c este mai lent n
parcurgerea secvenial a nregistrrilor, poate fi necesar la citirea i
recitirea unor sectoare care sunt plasate n diferite locuri ale fiierului
(necontinuu).
Acest tip de fiiere posed unele structuri adiionale, figura 28.8. n
primul rnd, exist un atribut care indic ordinea logic, adic adresa
urmtoarei nregistrri din fiier, n secvena structurii logice conform cheii
de clasificare. n al doilea rnd, exist atributul nregistrrilor suprimate,
care indic faptul c nregistrarea este activ sau deja a fost eliminat. Alt
structur este nregistrarea zero sau antetul. nregistrarea zero posed
atributul nceput, care arat adresa primei nregistrri n fiier, figura28.8,
nregistrarea aflat pe adresa 2. Astfel, structura reprezint o list care
indic nregistrrile n uz i ordinea lor n fiier, i un cmp Exclus pentru
nregistrrile terse.
nceput
0 2 Antet
Nume Exclus Pointer
1 Donic 3
2 Amihlchioaei 5
3 Guu * 4
4 Munteanu 6
5 Petrescu * 1
6 Rotaru *

Figura 28.8 Un fiier secvenial cu pointeri
Exist i implementarea cu dou liste, figura 28.9. Dei, prin
adugarea unui pointer n nregistrare structura se complic, aceast form
de organizare permite utilizarea spaiului nregistrrilor eliminate pentru
inserarea nregistrrilor noi. Or, cutarea spaiului disponibil, al unei
nregistrri suprimate, ntr-un fiier cu multe nregistrri este lent,
deoarece necesit multe accesri. n afar de pointerul de pstrare a
secvenei logice a nregistrrilor este utilizat un alt pointer pentru pstrarea
listei nregistrrilor excluse. Astfel, poate fi utilizat spaiul eliberat, insernd,
mult mai rapid, nregistrri noi. Nu se cunoate doar poziia primei
nregistrri i nici prima nregistrare care a fost eliminat. Adic, este
necesar adugarea la fiier a unui antet pentru pstrarea acestor
informaii. n structura cu dou liste, una indic nregistrrile n uz i
ordinea lor n fiier, iar alta - nregistrrile suprimate al cror spaiu poate fi
utilizat pentru inserare.

nceput Exclus
Nume
Donic
Amihalachioaei
Munteanu
Rotaru

Figura 28.9 Un fiier secvenial cu dou structuri de pointeri

n structura cu doi pointeri, n procesul de consultare, se identific
prima nregistrare cu adresa indicat de atributul nceput al antetului. Dat
fiind faptul c fiierul nu este ordonat fizic, n aceast structur, nu este
posibil realizarea cutrii binare. Apoi, se parcurge fiierul, folosind
adresele indicate n atributul Pointer al secvenei de nregistrri pn ce
cmpul cerut va fi localizat. Algoritmul de consultare:

1. Se trece la poziia primei nregistrri indicat n antet.
2. Pn cnd nregistrarea curent <= nregistrarea dezirabil:
a) dac nregistrarea curent = nregistrarea dezirabil, terminare cu
succes;
b) dac pointerul secvenei >0, se trece la urmtoarea nregistrare
indicat de pointer;
c) altfel terminare cu eec.
3. Terminare cu eec.

Dup cum se poate observa, sfritul cutrii (sfritul fiierului) este
atins cnd pointerul secvenei de nregistrri nu indic spre alt nregistrare
(nu posed vreo valoare sau adres).
Pentru a include o nregistrare, nu mai e nevoie de reorganizarea
fiierului, deoarece ordinea fizic, n acest caz, poate fi diferit de ordinea
logic (care este determinat de pointeri). Este suficient inserarea
nregistrrii n primul loc liber. Primul loc liber poate fi o nregistrare
suprimat i pentru a ti c exist o astfel de nregistrare, este destul de
verificat atributul Exclus n antetul fiierului. n cazul n care nu exist
nregistrri excluse, un spaiu nou este creat la sfritul fiierului. Dup
selectarea locului de inserare se parcurge fiierul pentru identificarea
nregistrrilor precedent i urmtoare ale nregistrrii curente. Acestea
trebuie s aib valorile pointerilor actualizate, pentru ca nregistrarea nou
s ocupe poziia logic intermediar.
Algoritmul este urmtorul:

1. Localizarea unei nregistrri vide (suprimate) sau crearea unui spaiu
pentru nregistrarea nou la sfritul fiierului.
2. Inserarea nregistrrii n locul identificat sau creat.
3. Dac nregistrarea a fost inserat n locul uneia eliminate, se exclude
din lista nregistrrilor suprimate.
4. Identificarea nregistrrilor precedente i urmtoare;
5. Dac exist nregistrarea precedent se actualizeaz pointerul ei
pentru ca s arate spre nregistrarea inserat.
6. n caz contrar, pointerul antetului este cel ce trebuie actualizat.
7. Dac exist nregistrarea urmtoare, pointerul nregistrrii inserate se
actualizeaz pentru a o indica.

Pentru a exclude o nregistrare, se identific nregistrarea care
precede nregistrarea n cauz i se actualizeaz pointerul ei. Deoarece
nregistrarea precedent trebuie s dea continuitate logic fiierului,
pointerul ei se modific pentru a indica nregistrarea ce urmeaz dup
nregistrarea exclus. Astfel, valoarea pointerului nregistrrii suprimate
devine valoare a pointerului nregistrrii anterioare.
Algoritmul const din patru pai:

1. Localizarea nregistrrii ce trebuie suprimat, utiliznd lista secvenei
de nregistrri (pointerul).
2. Identificarea nregistrrii precedente i nregistrrii urmtoare;
3. Actualizarea pointerului nregistrrii precedente, atribuindu-i valoarea
pointerului nregistrrii ce trebuie suprimat;
4. Adugarea nregistrrii excluse n lista nregistrrilor excluse.

Modificarea unei nregistrri poate fi realizat prin eliminarea
nregistrrii ce trebuie modificat i inserarea nregistrrii cu valorile deja
modificate (metod mai laborioas, dar mai facil i practic).

Fiiere secveniale cu spaiu de tranzacii

Fiierele secveniale pot fi dotate cu un fiier auxiliar, numit fiier de
tranzacii. Deplasarea nregistrrilor este o operaie costisitoare. Pentru a
evita deplasarea nregistrrilor (rearanjarea) n fiierul principal n timpul
executrii operaiilor, o alt form de implementare a fiierului secvenial
presupune utilizarea a dou structuri:
fiierul principal (master) cu date.
fiierul de modificri sau fiierul de tranzacii (overflow) este un
fiier auxiliar, n care sunt temporar nregistrate modificrile
curente ale datelor, care vor fi utilizate pentru actualizarea
coninutului fiierului principal. n acest mod, nu au loc deplasri
de nregistrri n fiierul principal n timpul de executare a
operaiilor. Fiierul de tranzacii poate fi chiar unul virtual, adic,
nregistrrile pot fi plasate la sfritul fiierului principal.
Astfel, pentru a micora costul nalt de pstrare a ordinii fizice, se
utilizeaz dou structuri, plus o list de pointeri a secvenei de nregistrri
pentru meninerea ordinii logice, adic se separ grupul de nregistrri care
sunt fizic ordonate de operaiile nou-realizate.
Fiiere secveniale cu toate operaiile n fiierul de tranzacii. Aceast
variant de fiiere secveniale presupune c toate modificrile sunt fcute n
fiierul de tranzacii. Fiierul principal este actualizat numai n cazul
reorganizrii, folosind datele din fiierul de tranzacii.
n fiecare nregistrare din fiierul de tranzacii, trebuie s fie un cmp
auxiliar, unde se indic tipul operaiei ce a fost realizat (I inserarea, E
eliminarea i M modificarea). Toate operaiile (consultarea, inserarea,
eliminarea, modificarea) trebuie s nceap cu cutarea nregistrrii n
fiierul de tranzacii i examinarea etichetei acestui cmp. Dac
nregistrarea nu este gsit, atunci este cutat n fiierul principal. Trebuie
menionat c fiierul de tranzacii este, de asemenea, un fiier secvenial i,
deci, se supune acelorai reguli (nregistrri ordonate de cheia de
ordonare).
Inserarea trebuie s fie precedat de o consultare. Dac cheia este
gsit n fiierul de tranzacii cu eticheta I sau M, sau dac cheia este
ntlnit n fiierul principal, atunci trebuie s fie acionat procesul de tratare
a erorii (nu poate fi fcut o inserare cu o cheie deja existent). Dac cheia
e gsit n fiierul de tranzacii i are eticheta E, se insereaz o nregistrare
nou n fiierul de tranzacie, care este stocat n ordinea cheii de ordonare.
Astfel, pot fi necesare deplasri de nregistrri. Cu toate acestea, deoarece
fiierul de tranzacii este mic, executarea operaiei de deplasare este
uoar. Eticheta I trebuie plasat n nregistrarea nou, indicnd c este
una inserat.
Utilizarea fiierului de tranzacii schimb modul de consultare a
nregistrrilor. Astfel, o consultare a unei singure nregistrri dup cheia de
ordonare, ncepe de la fiierul de tranzacii, deoarece acesta conine
ultimele modificri. Trebuie, de asemenea, s fie examinat eticheta
operaiei (I, E sau M). Eticheta E indic faptul c cheia nu mai exist, iar
celelalte etichete indic faptul c consultarea va fi fcut asupra nregistrrii
n fiierul de tranzacii. ns, o consultare cu o cheie diferit de cea de
organizare are un cost nalt, deoarece fiierul de tranzacii trebuie analizat
(cu examinarea etichetelor) n ntregime i apoi fiierul principal, la fel, n
mod exhaustiv.
Operaia de parcurgere secvenial dup cheia de ordonare este
fcut n paralel n ambele fiiere i urmeaz aceleai raionamente ca ale
operaiei de reorganizare, cu intercalare. Dac este necesar parcurgerea
secvenial a nregistrrilor n alt ordine, atunci operaia trebuie fcut cu
algoritmi de ordonare, innd cont de existena nregistrrilor duplicate n
ambele fiiere.
Modificrile cmpurilor care nu fac parte din cheia de ordonare
trebuie fcute n fiierul de tranzacii. Mai nti, nregistrarea trebuie cutat
(operaia de consultare). Dac ea nu este gsit n nici unul din fiiere, este
acionat o procedur de eroare. Dac ea este gsit numai n fiierul
principal, o nregistrare nou va fi inserat n fiierul de tranzacii, cu
aceleai cmpuri ca ale nregistrrii iniiale, dar cu modificrile necesare i
cu eticheta M. Dac ea este gsit n fiierul de tranzacii, se verific
eticheta ei. Dac este E, ea deja a fost exclus i operaia este ntrerupt.
Dac eticheta este I, se modific direct aceast nregistrare cu eticheta I n
fiierul de tranzacii, fr a modifica eticheta. Modificrile (dac se permit)
n cmpurile care fac parte din cheia de ordonare sunt realizate n dou
operaii: una de eliminare a nregistrrii originale i una de inserare a
nregistrrii modificate.
Operaia de suprimare se efectueaz dup urmtoarele reguli. Mai
nti, se caut nregistrarea (operaia de consultare). Dac nu sete gsit,
exist o greeal. Dac exist numai n fiierul principal, o nregistrare este
adugat n fiierul de tranzacii (n ordinea cheii) cu eticheta de excludere.
Dac, deja, exist n fiierul de tranzacii, eticheta ei va indica urmtoarele
procese. Dac eticheta este E, exist o eroare (nregistrarea a fost, deja,
eliminat). Dac este M, se schimb aceast etichet cu E, iar dac este I,
aceast nregistrare trebuie eliminat fizic din fiierul de tranzacii cu
deplasri succesive de poziii (aceast operaie nu va putea fi desfcut).
Periodic, operaiile nregistrate n fiierul de tranzacii trebuie
actualizate n fiierul principal. De aceea, eticheta fiecrei nregistrri din
fiierul de tranzacii este analizat i operaiile respective sunt fcute n
fiierul principal.
Deoarece aceast aciune provoac deplasri n fiierul principal, o
alternativ este crearea unui fiier suplimentar, n care se copiaz fiierul
principal i n acesta sunt aplicate modificrile. n finalul operaiei de
reorganizare, fiierul de tranzacii devine vid, fiierul principal este suprimat
i fiierul auxiliar este redenumit cu numele fiierului principal. Deoarece
operaia de reorganizare are un cost nalt, ea trebuie s fie fcut off-line,
adic atunci cnd nregistrrile nu sunt actualizate. Periodicitatea depinde
de disponibilitatea de timp pentru realizarea acestei operaii i de numrul
de nregistrri n fiierul de tranzacii (se activeaz operaia de reorganizare,
dac volumul de tranzacii atinge o anumit limit, dup care eficiena
general de pstrare a datelor de SGBD scade).
Avantajul utilizrii acestui tip de organizare apare n cazul n care
sunt efectuate puine modificri on-line i cnd este posibil ntreruperea lor
pentru realizarea operaiei de reorganizare. Alt avantaj l constituie
parcurgerea secvenial, n mod aproape optimal, deoarece nregistrrile se
gsesc, din punct de vedere fizic, continuu. Cu toate acestea, exist
tendina de a analiza fiierul principal i cel tranzacional mpreun.
Un mare dezavantaj al acestui tip de organizare l constituie faptul c
consultrile pot fi fcute, n mod eficient, numai dup cheia de organizare.
Dac sunt necesare consultri sau parcurgeri pe mai multe chei, aceast
organizare nu este recomandat.
Fiiere secveniale cu unele operaii n fiierul principal. Pentru a
reduce creterea fiierului de tranzacii, operaiile care nu cer deplasri de
nregistrri sunt realizate direct n fiierul principal. n acest mod, se
diminueaz viteza de cretere a fiierului de tranzacii i, prin urmare,
micoreaz perioada de aplicare a operaiilor de reorganizare.
n afar de aceasta, pentru a nviora consultarea cnd se fac operaii
asupra fiierului de tranzacii, el, de asemenea, ar trebui s fie meninut
ordonat, mrind, astfel, costul operaiilor. De aceea, acest proces nu este
acceptat i inserrile se realizeaz la sfritul fiierului.
Se poate observa c ordinea fizic i ordinea logic sunt pstrate n
fiierul principal. n fiierul de tranzacii, nregistrrile nu sunt ordonate,
ntruct nregistrrile sunt inserate la sfrit. De aceea, pentru a menine
aceeai ordine n care a fost ordonat, este necesar adugarea unui pointer
pentru fiecare nregistrare cu o adres de deplasare (offset). Aceast adres
indic urmtoarea nregistrare care va fi folosit, dac e necesar, pentru a
ntocmi lista, meninnd, astfel, secvena logic a datelor dup cheia de
ordonare.
O dat cu adugarea unui cmp pentru fiecare nregistrare, ocupat de
pointer, exist dezavantajul ca procesul de parcurgere secvenial se
realizeaz mai lent, deoarece poate fi necesar citirea i recitirea
sectoarelor care se gsesc n diferite locuri ale fiierului (necontinuu), fapt
ce consum mai mult timp de cutare i de stare latent, n afar de
suprancrcarea cu spaiul ocupat de pointeri.
Inserarea unei nregistrri este fcut n fiierul de tranzacii sau,
dac este virtual, la sfritul fiierului principal n zona de tranzacii (de
parc nu ar exista cheia de clasificare). Secvena logic este pstrat de
lista definit de pointerul care trebuie actualizat la fiecare operaie realizat.
Mai trziu, fiierul este reorganizat.
n cazul operaiei de modificare, dac nici cheia primar i nici
lungimea nregistrrii nu sunt schimbate, nregistrarea este actualizat n
aceeai poziie. n caz contrar, ea este eliminat i cea nou este inserat n
fiierul de tranzacii. Aceast operaie trebuie s actualizeze lista secvenei
logice a datelor.
n cazul operaiei de eliminare, fiierul principal poate fi reorganizat
(operaia necesitnd mult timp). Atunci este necesar redefinirea listei
secvenei logice, care ar include toate nregistrrile care nu au fost
eliminate.
O alt metod este adugarea unui cmp auxiliar pentru pstrarea
unui indicator al nregistrrilor excluse, folosit la restructurarea ulterioar a
fiierului.
Reorganizarea fiierelor. Fiierul de tranzacii, de obicei, este folosit
doar pentru stocarea operaiilor de actualizare a fiierului secvenial i n
operaia de reorganizare care este aplicat numai n cazul cnd fiierul
principal se reorganizeaz, deoarece acumularea tranzaciilor, poate
diminua eficiena executrii lor. Aadar, n general, cnd fiierul de
tranzacii atinge o limit determinat sau se dorete elaborarea unui raport,
sau efectuarea unei consultri are loc reorganizarea fiierului secvenial. Or,
n prelucrarea normal, este puin obinuit utilizarea fiierului de tranzacii
ca o prelungire a fiierului secvenial.
Procesul de reorganizare a unui fiier secvenial S presupune
aplicarea unui algoritm, cum este cel de triere prin fuziune. Pentru aceasta,
fiierul de tranzacii T trebuie s fie ordonat dup acelai criteriu (cheie) ca
i fiierul S. Din fiierele (de tranzacii T i principal S) ordonate dup
acelai criteriu se poate construi un fiier secvenial nou A. Printr-o tratare
secvenial a fiierelor, cu o lectur exhaustiv a lui S, se copiaz fiierul
principal iniial, nregistrare cu nregistrare, n fiierul principal actualizat A
i, pentru fiecare nregistrare copiat, se intercaleaz cu nregistrrile
fiierului de tranzacii T, dac exist, fcnd comparaiile necesare i
producnd copia actualizat a fiierului principal.
Algoritmul este urmtorul:

1. Se citete o nregistrare a fiierului principal S (dac nu este marcat ca
fiind suprimat).
2. Se citete o nregistrare a fiierului de tranzacii T (dac nu este
marcat ca fiind suprimat).
3. Se compar aceste dou nregistrri. Cea cu valoare mai mic a cheii de
ordonare este copiat n fiierul principal actualizat A.
4. n fiierul care conine nregistrarea scris n fiierul principal actualizat
A, pointerul nregistrrii avanseaz (se localizeaz urmtoarea
nregistrare).
5. Se citete o nregistrare nou a acestui fiier (dac nu este marcat ca
fiind suprimat).
6. Se compar aceste dou nregistrri, scriind-o pe cea mai mic i
repetnd procesul pn cnd se atinge sfritul unui fiier din cele dou.
7. Se nscriu nregistrrile nesuprimate ale fiierului, care nc nu a fost
parcurs pn la sfrit, n fiierul principal actualizat A.

n acest proces, se observ c:
nregistrrile suprimate nu sunt copiate (sunt eliminate efectiv);
nregistrrile fiierului principal S, care nu figureaz n fiierul de
tranzacii T, sunt copiate n fiierul actualizat A;
nregistrrile fiierului de tranzacii T sunt prelucrate n lot i
plasate n fiierul actualizat A cu pstrarea secvenei ordonate
dup cheie.
n consecin, fiierul de tranzacii devine vid, iar nregistrrile
fiierului principal actualizat A sunt ordonate astfel nct secvena logic
este egal cu secvena fizic.

Cutarea secvenial cu blocuri de nregistrri

Partea ce mai scump (lent) a operaiei de accesare a memoriei
secundare este cutarea pentru obinerea poziiei corecte a unei nregistrri
pe disc. Aadar, se cere minimizarea numrului de accesri, pentru c
transferarea datelor, odat iniiat, este relativ rapid, dei este mult mai
lent dect transferarea datelor n memoria principal.
Evident, cutarea (seek) i citirea unei nregistrri i apoi cutarea i
citirea altei nregistrri au un cost mai mare dect cutarea i citirea
concomitent a dou nregistrri. Prin urmare, se poate mbunti cutarea
secvenial, dac, n loc de nregistrri, se recupereaz blocuri de
nregistrri i aceste blocuri se prelucreaz n memoria principal. Astfel,
gruparea nregistrrilor n blocuri este o tehnic utilizat pentru
mbuntirea cutrii. n general, dimensiunea blocului este definit n
funcie de caracteristicile fizice ale dispozitivului de stocare i ale datelor ce
trebuie memorate.
Bineneles, fiecare accesare a unui bloc de nregistrri va lua ceva
mai mult timp dect o accesare a unei nregistrri, dar beneficiul va fi
considerabil datorit reducerii timpului de cutare i timpului de rotaie.
Astfel, formarea blocurilor de nregistrri:
mrete eficiena cutrii prin diminuarea numrului de accesri;
profit de diferena dintre costul de accesare n memoria
principal i costul de accesare a discului;
economisete timpul, deoarece reduce timpii de cutare i durata
strii latente;
nu modific numrul de comparaii n memoria principal, dar,
probabil, mrete cantitatea de date transferate ntre disc i
memoria principal (este citit un bloc ntreg, n timp ce
nregistrarea cutat este una n bloc, iar restul nu sunt
necesare).
Astfel, se poate concluziona c deosebirea dintre accesul la memoria
principal i disc este ceea ce ghideaz proiectarea structurilor de fiiere i,
prin urmare, cutarea secvenial este mai eficient:
n fiierele cu puine nregistrri;
n fiierele cu puine cutri (de exemplu, pstrate pe benzi
magnetice);
n cutarea nregistrrilor dup chei secundare, ale cror valori au
mai multe duplicate.


28.4 Indeci

Indecii sunt structuri de acces care se utilizeaz pentru accelerarea
accesului la nregistrri i a rspunde anumitor criterii de cutare. Unele
tipuri de indeci, numite i ci de acces secundare, nu afecteaz amplasarea
fizic a nregistrrilor pe disc, fapt ce ofer ci alternative de acces pentru
gsirea nregistrrilor, n mod eficient, n cmpurile indexate. Exist i alte
tipuri de indeci care se pot construi numai asupra fiierelor care au o
anumit organizare.
Astfel, exist tipuri de indeci care se utilizeaz asupra fiierelor
ordonate (indeci cu un singur nivel) i structuri sub form de arbore
(indeci multinivel, B-arbori i B
+
-arbori). n afar de aceasta, se pot
construi indeci, folosind funcii de dispersie i alte structuri de date.
Utilizarea tehnicilor de indexare poate fi o alternativ a ordonrii,
dac este necesar organizarea unui fiier, pentru a fi cutat cu ajutorul
cheilor.
n general, indecii amelioreaz executarea accesului la date. n cazul
fiierelor, permit localizarea rapid a nregistrrilor, cu avantajul c fiierul
de date nu trebuie s fie reorganizat, dac sunt inserate noi nregistrri n
acesta. Este de ajuns s fie reorganizai indecii. Indecii, de asemenea,
permit, n afar de ameliorarea timpului de acces pentru cutarea dup o
cheie, susinerea mai multor viziuni asupra nregistrrilor dintr-un fiier de
date, graie structurilor de indeci secundari. Ba mai mult, cu ajutorul
indecilor, pot fi mbinate mai multe viziuni particulare.
Indexul poate exista independent de organizarea fiierului de date,
ceea ce permite crearea mai multor indeci, dac se dorete optimizarea
accesului la date al mai multor tipuri de interogri. n schimb, crearea fr
discernmnt a unui numr mare de indeci poate fi costisitoare pentru
SGBD-ul care trebuie s-i administreze. Pentru fiecare operaie de
actualizare a relaiei, repercusiunile acestei actualizri se extind asupra
tuturor indecilor. O alegere judicioas a indecilor, ntr-un numr optim,
este, deci, unul din factorii eseniali ai performanei unui sistem.

Concepte preliminare

Indexul este un fiier. Fiierul index este o structur auxiliar asociat
fiierului de date, proiectat pentru a oferi forme mai eficiente de acces i
localizare a datelor specificate. Adic, fiind dat un argument de cutare,
scopul indexului este accelerarea procesului de identificare a adresei
nregistrrii necesare n fiierul de date.
Pot exista unul sau mai multe fiiere index, ale cror nregistrri
leag valorile cheii cu poziiile lor n fiierul de date. Adic o nregistrare a
fiierului index este constituit din dou cmpuri, cheia nregistrrii din
fiierul de date i adresa respectiv pe disc, <cheie, adres>.
Astfel, un index este ntotdeauna specificat de o cheie de acces, iar n
calitate de cheie de acces poate fi luat orice submulime de atribute ale
schemei relaionale, dac aceast submulime este definit n calitate de
index. Exist dou tipuri principale de indeci:
indexul ordonat, care se bazeaz pe valorile ordonate ale cheilor.
nregistrrile fiierului sunt stocate conform unui criteriu de
ordonare;
indexul hash sau index cu dispersie, care se bazeaz pe
distribuirea uniform a valorilor determinate de o funcie, numit
funcie de dispersie (hash function).
Exist diverse tehnici att pentru indecii ordonai, ct i pentru
indecii cu dispersie. Nici una din ele nu e mai bun, dar fiecare tehnic este
mai adecvat pentru anumite aplicaii ale bazei de date. Factorii care
determin selectarea tipului de index sunt:
tipul de acces, care este admis n mod eficient; tipurile de acces
pot cuta nregistrri dup o valoare determinat a unui atribut
dat sau nregistrri ale cror atribute iau valori dintr-un interval
de valori;
timpul de acces timpul consumat pentru gsirea unei
nregistrri de date, sau a unei mulimi de nregistrri, utiliznd
tehnica respectiv;
timpul de inserare timpul consumat pentru includerea unui nou
articol de date; acest factor cuprinde timpul cheltuit pentru
gsirea locului corect, pentru includerea articolului i, de
asemenea, timpul cheltuit pentru actualizarea structurii indexului;
timpul de suprimare timpul consumat pentru eliminare, inclusiv
timpul afectat gsirii nregistrrii i actualizrii structurii indexului.
spaiul de memorie spaiul adiional ocupat de fiierul index;
dac mrimea spaiului adiional este rezonabil, n general,
spaiul sacrificat se recupereaz prin obinerea unei executri mai
bune a operaiilor.
Un fiier index este mai uor de lucrat dect un fiier de date,
deoarece nregistrrile indexului sunt de lungime fix (faciliteaz navigarea
cu tehnici mai eficiente de cutare, cum este cea binar) i este mult mai
mic dect fiierul de date. nregistrrile de lungime fix ale fiierului index
impun i o limit a lungimii cheii primare, fapt care, uneori, poate crea
probleme n practic. nregistrrile indexului pot conine i alte cmpuri
(lungimea nregistrrii, de exemplu), n afara celor dou.
De obicei, pentru unul i acelai fiier de date pot exista mai multe
fiiere index. Aplicnd noiunea de cheie de cutare, dac sunt mai muli
indeci pentru un fiier de date, exist mai multe chei de cutare n acest
fiier.
Utilizarea indecilor are urmtoarele avantaje:
fiierul de date poate fi de tip serial (nregistrrile sunt inserate la
sfritul fiierului, n ordinea de intrare);
adugarea nregistrrilor este mult mai rapid, dac indexul poate
fi pstrat n memoria principal;
n index, se poate localiza rapid o cheie, utiliznd cutarea binar;
pornind de la cheie i adres, pentru recuperarea unei nregistrri
este necesar o singur accesare a fiierului de date.
Astfel, dac nregistrrile unui fiier sunt de lungime variabil, este
dificil utilizarea metodelor de ordonare i aplicarea cutrii binare. Aici o
alternativ poate fi construirea unui index. Structura indexului, n acest caz,
poate fi foarte simpl: indexul este un fiier cu nregistrri de lungime fix,
n care fiecare are dou cmpuri, un cmp pentru cheie i altul pentru
poziia iniial a nregistrrii n fiierul de date. Fiecrui cmp cheie al
fiierului de date i corespunde un cmp cheie n index. Indexul este
ordonat, n timp ce fiierul de date nu este. Fiierul de date poate fi
organizat n ordinea intrrii nregistrrilor.
Dac indexul nu ncape n memoria primar, accesarea i meninerea
lui trebuie fcut n memoria secundar. n acest caz, utilizarea indecilor
simpli este problematic, deoarece:
cutarea binar poate necesita multe accesri ale discului;
deplasarea nregistrrilor, dup operaiile de inserare i eliminare,
devine inevitabil pentru meninerea indexului.
n acest context, dac viteza de acces este caracteristica dezirabil
principal, indexul poate fi organizat, utiliznd tehnici cu funcii de
dispersie. Dac nu, B-arborele poate fi o structur acceptabil atunci cnd
se cer accesri dup cheie sau accesri secveniale eficiente.

Indeci ordonai

Indexul ordonat pstreaz ordinea cheilor de cutare i oricrei chei i
asociaz adresele nregistrrilor care o conin. Indexul ordonat poate fi
primar sau secundar.
Indeci primari. Indexul ordonat este un index primar, dac fiierul de
date i indexul au acelai criteriu de ordonare, adic, dac fiierul este
ordonat de un cmp cheie, indexul care se definete pe acest cmp este un
index primar. Deseori, termenul index primar este utilizat pentru
desemnarea uni index al cheii primare (a unei relaii din baza de date), dar
aceast form nu este un standard i poate fi evitat.
Dac toate fiierele sunt ordonate secvenial dup o singur cheie de
cutare, aceste fiiere cu un index primar pe cheia de cutare sunt numite
fiiere indexat secveniale. Fiierele indexat secveniale reprezint una din
cele mai vechi scheme de index utilizate n bazele de date. Ele sunt
proiectate pentru aplicaiile care necesit att prelucrarea secvenial a
fiierelor, ct i accesul aleatoriu la nregistrri individuale.
Un fiier index primar poate fi:
un index dens, dac pentru orice valoare a cheii de cutare din
fiierul de date exist o nregistrare n fiierul index (sau intrare
index) respectiv. Evident, nregistrarea index conine valoarea
cheii de cutare i un pointer spre prima nregistrare de date cu
aceast valoare a cheii de cutare.
un index rar, dac nregistrrile fiierului de date sunt grupate
dup un criteriu i pentru fiecare grup (organizat n bloc) exist o
nregistrare index asociat. Astfel, fiecare nregistrare index are o
valoare a cmpului cheie egal cu valoarea cheii primei
nregistrri de date a blocului respectiv i un pointer spre acest
bloc.
Pentru inserarea datelor n poziia corect n fiierul de date este
necesar, n afar de deplasarea nregistrrilor pentru a deschide spaiu
pentru cea nou, modificarea unor nregistrri ancor (prima nregistrare a
blocului). Ca i n indecii deni, fiecare nregistrare a indexului rar conine o
valoare a cheii de cutare i un pointer spre prima nregistrare de date cu
aceast valoare a cheii.
Pentru un fiier index rar, localizarea unei nregistrri dup un
argument de cutare se face n dou etape: n prima este consultat indexul
i determinat blocul n care trebuie s se gseasc nregistrarea i n a doua
- blocul selectat este cutat i localizat n el nregistrarea dorit. Adic,
pentru localizarea unei nregistrri, se obine intrarea indexului cu cea mai
mare valoare a cheii, mai mic sau egal cu valoarea cheii cutate. Adresa
din acea nregistrare permite accesul la blocul care poate conine
nregistrarea cutat. Apoi, n blocul respectiv, se face o cutare secvenial
sau prin alt metod.
Deoarece n indexul dens exist o nregistrare care indic direct
nregistrarea cutat n fiierul de date, se poate crede c recuperarea unei
nregistrri cu un index dens este mai eficient dect a uneia cu un index
rar. ns, indecii deni sunt prea mari i ocup mai mult spaiu, fapt ce
complic sarcina de actualizare (inserare i suprimare) a lui. n afar de
aceasta, indecii rari exploreaz bine caracteristicile fizice ale dispozitivelor
secundare. Astfel, fiecare bloc definit de indexul rar poate fi ncrcat n
memoria principal dintr-o singur accesare i manipulat n memoria
principal, consumnd un timp nesemnificativ. Prin urmare, cnd trebuie s
fac o alegere, proiectantul trebuie s gseasc un compromis ntre timpul
de acces i spaiul suplimentar, pentru a lua o decizie mai bun, care este
influenat direct de aplicaia n cauz.
Indeci secundari. Indexul asociat cheii de ordonare a fiierului de
date este numit, n afar de index primar, i index cluster. Ali indeci, ale
cror chei de cutare specific o ordine diferit de ordinea secvenial, se
numesc indeci secundari. n ambele cazuri, intrrile indexului sunt
ordonate de valoarea de acces, avnd ca obiectiv creterea eficienei
cutrii.
Astfel, dac un fiier nu este ordonat, orice index care se definete
asupra lui este un index secundar. De asemenea, un index secundar este
indexul definit pe un cmp diferit de cmpul de ordonare al fiierului.
Indexul secundar poate fi dens sau rar, avnd aceleai specificaii ca
i indexul primar. Indexul secundar, ca i indexul primar, este un fiier
ordonat cu dou cmpuri: cmpul de indexare (orice cmp al fiierului de
date diferit de cel de ordonare) i un pointer spre un bloc sau spre o
nregistrare. Dac indexul secundar este definit pe un cmp cheie (cheie
secundar), exist cte o nregistrare index pentru fiecare cheie a fiierului,
adic indexul secundar este un index dens.
Cu introducerea indecilor secundari, a disprut necesitatea de
pointeri adiionali n nregistrri i necesitatea de parcurgere secvenial n
ordinea cheii secundare. ns utilizarea acestei structuri l impune pe
administratorul bazei de date s analizeze mulimea potenial de interogri
pentru a selecta cmpurile asupra crora se vor defini indecii secundari.
Indeci multinivel. Pentru fiierele cu multe nregistrri, indexul este,
totui, destul de mare i nu poate fi ncrcat n memoria principal. De
aceea sunt utilizai indeci cu multe niveluri, adic indeci cu niveluri rare.
Un index multinivel este format pentru un fiier index, care se
numete primul nivel sau nivel-baz al indexului multinivel. Primul nivel
este un fiier ordonat cu o valoare distinct a cmpului de indexare n
fiecare intrare. De aceea, asupra primului nivel se poate crea un index
primar. Acest index constituie al doilea nivel al indexului multinivel.
Deoarece al doilea nivel este un index primar, n el exist cte o intrare n
fiecare bloc al primului nivel. Procesul poate continua i asupra acestui
nivel, dac este necesar. Atunci al treilea nivel va fi un index primar pentru
nivelul doi.
Aceast schem multinivel se poate utiliza asupra oricrui tip de
index, fie primar, fie secundar, cu condiia ca, ntotdeauna, primul nivel s
ia valori distincte n cmpul de indexare i intrrile s fie de lungime fix.
Astfel, dac fiecare bloc se presupune c are r intrri, adic fiecare bloc
reduce numrul de intrri de la nivelul anterior de r ori, atunci un index
multinivel cu i intrri, la primul nivel, va avea aproximativ n niveluri, unde
.

i n
r
log =

Indeci cu dispersie

Se pot crea structuri de acces similare indecilor, dar bazate pe
dispersii. Astfel, intrrile indexului (K,Pr) se pot organiza ca un fiier
dispersat, care i va schimba dimensiunea, folosind dispersia dinamic,
extensibil sau liniar. Algoritmul aplic funcia de dispersie asupra cheii K.
ndat ce este prezentat o intrare (o cheie), pointerul Pr se utilizeaz
pentru localizarea nregistrrii n fiierul de date.
Funcia de dispersie asociat poate fi utilizat att pentru organizarea
fiierelor, ct i pentru crearea structurii indexului.


28.5 Fiiere indexat secveniale

Fiierele indexat secveniale sunt un tip de organizare a fiierelor n
care nregistrrile sunt identificate de un index, numit cheie de acces i
fiecare cheie reprezint valoarea cu care sunt identificate alte date ale
nregistrrii n fiier. Aceast cheie de acces trebuie s fie unic pentru
fiecare nregistrare, adic nu sunt admise dou nregistrri cu aceeai
valoare a cheii. n afar de aceasta, toate fiierele (inclusiv indexul) sunt
ordonate secvenial dup cheia de acces, care, de fapt, este cheia primar a
fiierului cu date.

Structuri ale fiierelor indexat secveniale

ntruct volumul datelor dintr-un fiier secvenial poate fi foarte mare
i numrul de accesri (cu o executare joas) nalt, se utilizeaz alte tehnici
pentru manipularea eficient a nregistrrilor. Astfel, se folosete o structur
de acces, asociat la fiier, care ofer o mai mare eficien n localizarea
nregistrrii prezentate de argumentul de cutare, dect metodele aplicate
n fiierele secveniale.
Un fiier indexat secvenial este constituit dintr-un fiier secvenial i
un index (structura de acces). Structura lui constituie trei spaii de lucru:
spaiul pentru date (fiier principal), spaiul rezervat nregistrrilor
excedentare (fiier de tranzacii) i spaiul pentru index (fiier index).
Fiierul index poate fi organizat n niveluri, de la indexul principal
(rdcina), pn la nivelul de acces la nregistrare.
Astfel, pentru accelerarea cutrii nregistrrilor, fiierul indexat
secvenial utilizeaz fiierul de date i fiierul index. Fiierul principal (de
date) este de tip secvenial, cu nregistrri grupate n blocuri i ordonate de
o cheie de ordonare. Fiierul index este format din perechi <cheie, adres>.
Adresa indic nregistrri sau blocuri n fiierul principal sau indic blocuri de
nregistrri n propriul fiier index (formnd un arbore). Adic, pot fi mai
multe niveluri de indeci, ei fiind stocai n acelai fiier fizic sau n fiiere
diferite. Cnd se prelucreaz blocurile, perechea <cheie, adres> (fie bloc
de date sau bloc de index) care arat spre urmtorul nivel conine cheia ce
corespunde nregistrrii cu valoarea cea mai mare (variant mai comun) n
bloc.
Avantajul utilizrii structurilor n blocuri const n faptul c blocurile
sunt citite i ncrcate n memoria central n ntregime. Dimensiunea
blocului trebuie determinat, inndu-se cont de caracteristicile
dispozitivelor fizice de lectur i scriere i limitele sistemului utilizat
(responsabil de operaiile de lectur i scriere pe dispozitivele fizice).
O strategie bun este rezervarea n fiecare bloc al fiierului a unui
spaiu liber pentru nregistrrile noi ce vor fi incluse. Astfel, la prima
ncrcare a fiierului de date i la fiecare reorganizare a fiierului
(rearanjare), este ocupat numai o parte din fiecare bloc. Pentru a evita
umplerea rapid a blocurilor, spaiul liber este rezervat, inndu-se cont de
statisticile de includeri de nregistrri, iar reorganizarea este o procedur ce
trebuie fcut periodic.
O alternativ mai potrivit este utilizarea unui singur spaiu pentru
nregistrrile excedentare, deoarece nici o dat nu se poate prezice cnd vor
fi completate unele blocuri. i dac aceast problem apare, ceva trebuie
ntreprins pentru a include o nregistrare nou, care nu poate fi plasat
imediat n poziia adecvat n fiier (aceast operaie necesit reorganizarea
fiierului care se executat n momente speciale).
Pentru acumularea nregistrrilor excedentare, una din cele mai bune
opiuni este crearea unui fiier de tranzacii (overflow). Acest fiier are
aceeai structur ca i fiierul de date, cu nregistrri suplimentate cu un
cmp care permite nlnuirea nregistrrilor. nregistrrile excedentare sunt
incluse n fiierul de tranzacii (prima poziie vid) i formeaz o list
nlnuit (cresctor dup cheia de ordonare).
Fiierul de tranzacii poate fi utilizat n diverse moduri. O variant
este folosirea unei liste de nregistrri excedentare pentru fiecare bloc al
fiierului de date, figura 28.10. De aceea, n fiierul principal exist cte un
pointer asociat fiecrui bloc. El indic o nregistrare n fiierul de tranzacii,
care este prima n lista de nregistrri excedentare ale blocului. Aceast list
poate fi format din cheile mai mari dect cea mai mare din bloc (i mai
mici dect cea mai mic a blocului urmtor), sau, din chei mai mici dect
cea mai mic din bloc (i mai mari dect cea mai mare a blocului anterior).
Aici trebuie inut cont c cea mai mare cheie a blocului nu poate fi exclus
fizic, deoarece este utilizat n nivelul intern al indecilor.
Aceast variant necesit reorganizarea nregistrrilor ntre blocul din
fiierul de date i lista de nregistrri excedentare, pstrnd, dup inserri i
suprimri, ordinea cheii n bloc i n list (deplasnd nregistrrile respective
din bloc spre list sau din list spre bloc). Avantajul acestei structuri este o
mai bun utilizare a spaiului n blocuri, deoarece spaiul din fiier ocupat de
nregistrrile excluse (logic) poate fi ocupat de alte nregistrri numai dup
reorganizare.
I n d e x Cod Offset
1312 1 1032 1 1 1000
4 1234 4 2 1020
Index extern 1312 7 3 1032 105
1402 10 4 1113
2524 13 5 1154
16 6 1234 107
Index intern 7 1267
nregistrri excedentare 8 1278
Cod
Offset
9 1312 102
100
2743 104 10 1350
101
1071 103 11 1356
102
1314 * 12 1402 *
103
1082 * 13 2413
104
2800 * 14 2502
105
1060 101 15 2524 108
106
2682 100 16 2567
107
1242 * 17 2605
108
2530 * 18 2656 106

Figura 28.10 nregistrri excedentare asociate cu blocuri

Exist i alternativa cnd listele cu nregistrri excedentare se
asociaz cu nregistrrile din fiierul principal i nu cu blocurile, figura
28.11. Astfel, fiecare nregistrare are cte un pointer nul sau care indic
spre lista respectiv de nregistrri excedentare. Aceast list este
constituit din nregistrri cu chei mai mici dect a nregistrrii asociate i
mai mari dect a nregistrrii anterioare. n aceast structur, eliminrile de
nregistrri n blocuri vor fi fcute numai la nivel logic (cu includerea unei
etichete).
I n d e x Cod Offset
1312 1 1032 1 1 1000 *
4 1234 4 2 1020 *
Index extern 1312 7 3 1032 105
1402 10 4 1113 *
2524 13 5 1154 *
16 6 1234 *
Index intern 7 1267 *
nregistrri excedentare 8 1278 *
Cod
Offset
9 1312 102
100
2743 104 10 1350 *
101
1071 103 11 1356 *
102
1314 * 12 1402 *
103
1082 107 13 2413 *
104
2800 * 14 2502 *
105
1060 101 15 2524 108
106
2682 * 16 2567 *
107
1242 * 17 2605 *
108
2530 106 18 2656 100

Figura 28.11 nregistrri excedentare asociate cu nregistrri

Avantajele organizrii indexat secveniale sunt cele ale organizrii
directe i organizrii secveniale. Adic, un avantaj al acestei organizri este
posibilitatea de a mbina consultarea rapid a unei nregistrri (prin index)
cu parcurgerea facil secvenial a tuturor nregistrrilor (dup cheia de
ordonare).
Cu toate acestea, structura nu este adecvat pentru consultarea dup
mai multe chei (n afar de cea de ordonare) i pentru sistemele n care
operaiile de actualizare sunt fcute 24 ore pe zi, n toate zilele. n
sistemele, unde sunt multe inserri (cu multe liste de nregistrri
excedentare), are loc degradarea general a executrii operaiilor din cauza
deplasrilor de nregistrri ntre blocuri i liste n momentul inserrilor sau
eliminrilor (prima alternativ), sau din cauza consultrilor exhaustive n
listele cu nregistrri excedentare (alternativa a doua).
Astfel, indexul trebuie actualizat ncontinuu, pe msur ce
nregistrrile sunt adugate sau eliminate. n afar de aceasta, n raport cu
organizarea direct, sunt necesare etape suplimentare pentru localizarea
nregistrrilor - indexul trebuie s fie utilizat pentru orice accesare.

Fiierele indexat secveniale i dispozitivele de stocare

Metoda indexat secvenial presupune c nregistrrile sunt stocate
pe dispozitive cu acces direct, iar pentru operaiile de acces direct exist
indeci care permit cutarea adresei unei nregistrri individuale. n cazul n
care se solicit accesul aleatoriu, folosind diverse chei de acces, trebuie
construit un index pentru fiecare din ele. n general, indecii au o structur
ierarhic (pe niveluri), pentru o localizare rapid a pistei care conine
nregistrarea cutat.
Pentru a profita de caracteristicile dispozitivelor secundare de stocare
a datelor i a face mai eficient procesul de cutare, este indicat s se
construiasc indeci structurai, n mai multe niveluri, n acord cu nivelurile
de organizare fizic a acestor dispozitive. Numrul de niveluri este
proporional cu numrul de intrri (numrul de indeci). Aceti indeci pot fi
implementai, de exemplu, n form de B-arbori, datorit flexibilitii mari a
acestei structuri n ceea ce privete operaiile de inserare i eliminare n
fiierul index i eficienei de cutare pe care o ofer.
Astfel, fiierul index se construiete structurat n acord cu nivelurile
fizice ale modului de stocare pe discurile magnetice. Nivelurile fizice sunt
discul, cilindrul, pista i sectorul. Indexul de cilindru conine pentru fiecare
cilindru ocupat de fiier, o intrare ce indic cea mai mare valoare stocat a
cheii de ordonare. Cu fiecare cilindru este legat un index de pist, care
indic, pentru fiecare pist a cilindrului, cea mai mare valoare a cheii care o
conine. Indexul de pist al unui cilindru este stocat pe cilindru. Indexul de
nivel mai nalt, asupra indexului de cilindru, este numit index principal i
conine, pentru fiecare disc (sau grup de cilindri) ocupat de fiier, valoarea
cea mai mare a cheii stocate.
Indexul principal i de cilindri, cnd este posibil, se pstreaz n
memoria principal, astfel ca, n procesul de cutare, cilindrul, unde se
gsete nregistrarea cutat, s fie identificat, fr accesarea discului.
Dup obinerea cilindrului, acesta este accesat pentru lectura indexului lui
de piste, care permite localizarea pistei, unde se gsete nregistrarea. Pista
selectat este, atunci, citit i n ea este localizat (de o metod de cutare)
nregistrarea solicitat. n acest proces, numai un cilindru este accesat. E
important de menionat c indexul de pist nu precizeaz (nu are nevoie)
coninutul pentru fiecare nregistrare sau adres a pistei, ntruct el este
determinat de secvena n care apare la intrarea n index. Acelai lucru se
ntmpl i cu indexul cilindrilor.
Chiar dac nu se manipuleaz direct structura disc/cilindri/piste este
important structurarea indexului n niveluri, n primul rnd, pentru c
nivelurile externe (care nu sunt direct legate cu fiierul de date) antreneaz
puine intrri, ceea ce permite s fie stocate n memoria principal, astfel
devenind eficient cutarea n indexul primar (numai un bloc), fapt ce, la
rndul su, eficientizeaz cutarea fiierului de date (numai un bloc).

Operaii cu fiiere indexat secveniale

Accesul aleatoriu la nregistrri este realizat, folosind indexul.
Argumentul de cutare definete calea n index, care duce spre adresa
nregistrrii solicitate. Adresa obinut de index poate fi adresa nregistrrii
sau adresa blocului care o conine. n ultimul caz, pentru localizarea
nregistrrii, este necesar efectuarea unei cutri n blocul respectiv care,
la rndul su, poate cere accesarea spaiului rezervat nregistrrilor
excedentare.
Fiierele indexat secveniale trebuie, de exemplu, s fie reorganizate
cnd nregistrrile excluse logic nu sunt refolosite de algoritmul de includere
a nregistrrilor. n acest caz, spaiul eliberat de nregistrrile excluse
trebuie s fie ocupat dup reorganizarea fiierului, care presupune i o
reorganizare complet a fiierului index, deoarece poziiile fizice ale unor
nregistrri vor fi modificate.
Deschiderea i nchiderea fiierelor. Deschiderea unui fiier indexat
secvenial implic identificarea fiierului de date, cheilor de acces pentru
care exist indeci i care sunt fiierele index, fr a cunoate modul cum
sunt structurate acestea, cte niveluri are fiierul index asociat. De multe
ori, indecii pot fi creai numai cnd se utilizeaz fiierul (adic indexul nu e
stocat pe disc). Prin urmare, ntotdeauna cnd un fiier este deschis, trebuie
s se creeze n memorie structurile respective de acces.
nchiderea fiierului este, de obicei, o sarcin simpl i depinde de
faptul cum se lucreaz cu el. Dac indecii sunt manipulai numai n
memoria principal, fiierul de date se poate nchide fr nici o operaie
adiional. Cu toate c manipularea indecilor are loc n memoria primar,
deseori (cazul cnd aceast structur este modificat), este necesar
salvarea fiierului index pe disc, or generarea fiierelor index poate fi o
sarcin foarte retard. n acest caz, este important s se cunoasc care
indeci sunt temporari i care indeci sunt permaneni. De asemenea,
trebuie prelucrat spaiul de nregistrri excedentare, pentru c se
recomand ca fiierul nchis s aib spaiul de tranzacii liber. Prin urmare,
mai nti se face reorganizarea fiierului, apoi se nchide.
Consultarea nregistrrilor. Cutarea unei nregistrri dup cheia de
ordonare este fcut mai nti n fiierul index (pornind de la nivelul extern).
Se caut cheia imediat mai mare sau egal cu cea solicitat. Cu adresa
obinut se caut n nivelul urmtor al indexului, citind un bloc de
nregistrri din index. n acest bloc, se caut cea mai mare cheie. Se repet
cutarea pn nu mai exist niveluri de indeci i adresa obinut
corespunde unui bloc de nregistrri n spaiul de date al fiierului principal.
Apoi se citete acest bloc, cutnd cheia cerut. Dac este gsit, trebuie s
se analizeze eticheta de eliminare (dac eticheta exist, atunci cheia nu mai
exist). Dac cheia nu se ntlnete n acest bloc, se verific dac se afl n
lista de nregistrri excedentare, fie n bloc sau nregistrare. Dac este, se ia
adresa indicat (corespunztoare unei poziii n fiierul de tranzacii) i se
parcurge lista n cutarea cheii cerute. n general, n fiierul de tranzacii nu
se lucreaz cu etichete de eliminare, deoarece aici eliminrile sunt, de
obicei, fizice.
Consultarea unei nregistrri dup cheia care nu e de ordonare
necesit o cutare exhaustiv a tuturor nregistrrilor att n blocuri, ct i
n listele de tranzacii.
Inserarea nregistrrilor. Pentru inserarea unei nregistrri, iniial se
caut n fiierul index i se determin n ce bloc de date nregistrarea
trebuie s fie inclus. ndat dup determinarea poziiei, nregistrarea este
inclus n spaiul de nregistrri excedentare i se actualizeaz legturile,
dac spaiul de tranzacii exist pentru fiecare nregistrare.
Dac spaiile de nregistrri excedentare sunt rezervate blocurilor,
nregistrarea este inserat n blocul selectat n spaiul rezervat pentru date.
n cazul cnd acesta este plin sau nu exist spaiu pentru inserarea
nregistrrii respective, astfel ca nregistrrile acestui fiier s pstreze
ordinea secvenial, este inserat n spaiul de tranzacii al blocului, dac
cheia sa este mai mare dect cheia ultimei nregistrri a blocului principal i
se actualizeaz legturile.
n caz contrar, ultima nregistrare a blocului principal este trecut n
spaiul de tranzacii i nregistrarea nou este inserat n poziia sa corect
din blocul principal (pot fi deplasri nuntru blocului). Poate exista un cmp
similar, n acest spaiu, care ar indica urmtoarea adres n spaiul de date
sau de tranzacie.
n unele implementri inserrile pot fi realizate n blocuri, n spaiile
eliberate de nregistrrile care au fost excluse sau n spaiile rezervate
pentru aceasta la sfrit. n acest caz, spaiile pentru nregistrrile
excedentare pot s nu fie folosite. Aici, sistemul localizeaz n index blocul
unde va fi stocat nregistrarea. Dup aceast operaie, se gsete, n
fiierul de date, blocul dezirabil i se include nregistrarea n poziia corect,
adic n poziie ordonat.
nregistrarea este scris pe prima adres liber din fiier i sunt
actualizate poziiile relative ale acestei adrese (cheia nregistrrii, adresa
nregistrrii), apoi e scris n index (indeci). nregistrarea nou poate fi
stocat pe orice adres vid din spaiul alocat pentru fiier. n continuare,
trebuie inclus o intrare n fiierul index primar (ce se refer la cheia
primar) i n fiecare din celelalte fiiere index care exist. Inserrile n
fiierele index atrag dup sine restructurarea lor pentru ca nregistrarea s
fie scris n poziia adecvat n fiierul index.
Excluderea nregistrrilor. Ca i n alte organizri analizate anterior, n
fiierele indexat secveniale se pot realiza att excluderi fizice, ct i logice.
Excluderea fizic presupune eliberarea spaiului n fiierul de date (poate
dura mult timp), precum i eliminarea nregistrrii din fiierul de index.
O soluie mai bun, n majoritatea cazurilor, este excluderea logic.
n acest caz, se poate opta pentru mai multe variante. Este posibil
includerea unui cmp n fiierul de date care ar indica dac nregistrarea a
fost exclus. Astfel, nu e necesar modificarea indexului, ns devine
obligatorie verificarea acestui cmp la fiecare accesare a nregistrrii.
Alt opiune este utilizarea n index a unui indicator de excludere
asociat cheii primare. n acest mod, la accesarea fiierului index deja se va
putea verifica dac nregistrarea a fost exclus. n afar de aceasta,
nregistrarea ar putea fi detectat de algoritmul de inserare, care ar localiza
uor spaiile eliberate pentru inserri.
Dac fiierul posed mai multe structuri index (asupra diferitelor chei
de acces), sarcina de excludere a nregistrrilor se poate complica. n orice
caz, pentru orice structur index, nregistrarea exclus nu trebuie luat n
seam.
Modificarea nregistrrilor. Pentru modificarea nregistrrilor, mai
nti, se localizeaz nregistrarea ca ntr-o consultare (prin structura index),
folosind un argument de cutare n calitate de cheie de acces. n
continuare, se modific cmpurile respective i se nscrie nregistrarea.
Pot fi ntlnite dou situaii. Dac nu se modific cmpul cheii de
ordonare i lungimea nregistrrii este mai mic, nregistrarea poate fi scris
n locul n care se gsete. Dac modificarea datelor nregistrrii cere
modificarea poziiei ei n fiier, adic are loc modificarea unui cmp al cheii
de ordonare sau a lungimii ei, atunci nregistrarea se exclude din fiierul
iniial i se insereaz, n calitate de nregistrare nou, n fiierul de
tranzacii.
Astfel, sistemul de operare localizeaz n index adresa blocului unde
poate fi stocat cheia cutat. Dac blocul este gsit n fiierul de date,
nregistrarea este cutat secvenial. Modificarea unei nregistrri este
fcut cu o nou nscriere a nregistrrii actualizate, n cazul cnd nu se
modific dimensiunea ei, pe aceeai adres. Iar n cazul cnd lungimea este
modificat, nregistrarea veche este exclus, iar cea nou este inserat pe
alt adres, unde nregistrarea nou poate fi scris.
Modificarea unei nregistrri poate provoca modificarea indecilor,
deoarece aceasta poate modifica valoarea cmpurilor pentru care exist
indeci. Acest fapt implic eliminarea intrrilor anterioare n fiierul de index
i n includerea unei intrri noi, ce va implica o reorganizare a indexului. De
obicei, nu se admite modificarea cheii specificate pe cmpurile cheii
primare.
Lectura exhaustiv a nregistrrilor. Lectura exhaustiv este realizat
fr utilizarea indexului. Se citete fiecare nregistrare din fiierul principal i
continu aceast lectur, folosind lista de pointeri ce leag fiierul principal
de cel de tranzacii, n mod analogic, ca n fiierul secvenial.
ns, din cauza accesrii spaiului de nregistrri excedentare, aceast
operaie este mai puin eficient, n comparaie cu operaia respectiv n
fiierul secvenial. Ordinea fizic i logic a nregistrrilor nu este aceeai.
Deci, pentru a realiza eficient lectura exhaustiv a fiierului, este necesar
definirea unui index asupra acestui fiier care ar determina ordinea logic
de parcurgere a nregistrrilor. Dac exist cel puin un index exhaustiv
asupra fiierului, aceast operaie poate fi efectuat prin accesul serial la
fiierul index, urmat de accesri directe ale fiierului de date.
Reorganizarea fiierelor. Reorganizarea presupune o lectur
exhaustiv i transferarea tuturor nregistrrilor ntr-un fiier nou de date.
De fapt, toate nregistrrile sunt transferate n fiierul principal i spaiul de
tranzacii este eliberat. n continuare, se genereaz indexul nou.
Reorganizarea unui fiier indexat secvenial devine ntotdeauna
necesar, dac: spaiul de tranzacii devine foarte mare, diminund, astfel,
eficiena executrii accesrilor de fiiere. n afar de aceasta, are loc
eliminarea nregistrrilor excluse logic (dac aceste sectoare nu au fost
folosite de algoritmul de inserare a nregistrrilor). Dac trebuie, se
restructureaz fiierele index pentru mbuntirea accesului la nregistrri.
Astfel, reorganizarea fiierelor const n lectura tuturor nregistrrilor
i scrierea lor n alt fiier de date. Totodat, se elibereaz spaiile ocupate
de nregistrrile excluse i se genereaz o structur nou de indeci.
Operaia de reorganizare trebuie fcut periodic cnd sistemul nu
este utilizat (cel puin cnd nu sunt fcute inserri, modificri i suprimri),
deoarece reorganizarea necesit o analiz exhaustiv a nregistrrilor n
dou fiiere (principal i de tranzacii) i crearea unui fiier auxiliar cu
aceeai structur, ca a fiierului principal.


28.6 Fiiere indexate

n fiierele indexate, nregistrrile sunt identificate de un index, numit
cheie de acces, sau cheie a nregistrrii, sau cheie principal. Fiecare cheie
reprezint valoarea cu care celelalte date din nregistrare sunt identificate n
fiier. Aceast cheie de acces trebuie s fie unic pentru fiecare nregistrare,
adic, nu exist dou nregistrri cu aceeai valoare a cheii. nregistrrile
sunt accesate ntotdeauna de unu sau mai muli indeci, care nu au nici o
legtur cu ordinea de stocare fizic a nregistrrilor.
Pstrarea i respectarea ordinii fizice a nregistrrilor (pentru un
acces serial eficient) n fiierele indexat secveniale provoac mai multe
probleme, n principal, probleme care in de inserarea nregistrrilor noi. Pe
msur ce necesitatea de accesri seriale scade, n raport cu numrul de
accesri aleatorii, pstrarea secvenei fizice a fiierului afecteaz negativ
eficiena accesrii bazei de date, adic organizarea fiierelor devine
contraproductiv.
Prin urmare, devine mai convenabil utilizarea unui fiier indexat, n
care nregistrrile sunt accesate ntotdeauna prin unu sau mai muli indeci,
fr a ine cont de ordinea fizic a nregistrrilor. Indecii pot fi structurai
ca n organizarea indexat secvenial, ceea ce face mai eficient cutarea
nregistrrii.

Structuri i operaii n fiierele indexate

Fiierele indexate, ca i fiierele indexat secveniale, utilizeaz
structuri auxiliare (indeci) pentru accelerarea accesului la nregistrrile cu
date. Spre deosebire de precedentele organizri, n fiierele indexate exist
posibilitatea de utilizare a mai multor indeci (respectiv, mai multor chei) i
lipsete restricia c nregistrrile n fiierul principal trebuie s fie ordonate
de o cheie. Ultima caracteristic exclude utilizarea spaiilor de tranzacii.
Astfel, fiierul cu organizare indexat este constituit din dou
componente:
indexul, care conine cheile de acces i adresele fiecrei
nregistrri din fiierul de date; toate accesrile de nregistrri
sunt fcute prin aceast component, care este pstrat
ntotdeauna ordonat, dup cheia de acces;
fiierul de date, care stocheaz celelalte cmpuri ale tuturor
nregistrrilor fiierului, independente de orice ordonare sau
secven.
Ca i fiierele indexat secveniale, fiierele indexate susin dou
metode de acces: secvenial i aleatoriu.
Modul secvenial de acces reprezint o lectur secvenial a indexului
unui fiier indexat. Pentru fiecare intrare n index, este obinut adresa
nregistrrii din index n fiierul de date i cu aceast adres se citete
nregistrarea. n recuperarea secvenial a unui fiier, datele sunt citite
ntotdeauna ordonate dup cheie.
Modul aleatoriu de acces se caracterizeaz prin inexistena unei
secvene logice pentru recuperarea nregistrrilor, adic, dup citirea ultimei
nregistrri, poate fi citit a cincea sau prima, sau oricare alta - aceast
secven este determinat de programul aplicaie. n procesul de lectur,
sistemul localizeaz valoarea cheii dezirabile n index, identificnd adresa
nregistrrii corespunztoare n fiierul de date, i asigur accesul, cu
aceast adres, pentru recuperarea nregistrrii.
Consultarea fiierelor indexate poate fi realizat, folosind mai multe
chei. Dac exist un index pentru o cheie, cutarea este fcut, pornind de
la indexul n chestiune (prelucrarea ca n organizarea indexat secvenial)
pn se obine adresa unei nregistrri n fiierul de date. Nu este nevoie de
multe liste (nu mai sunt accesri). ns, dac excluderile nregistrrilor sunt
logice, este necesar examinarea existenei etichetelor de excludere. Dac
nu exist vreun index pentru cheia cerut, se realizeaz cutarea
exhaustiv a cheii n fiierul de date (analiza tuturor nregistrrilor pn ce
se ntlnete cea cutat).
Inserrile sunt fcute ntotdeauna n fiierul de date, n orice spaiu
liber, deoarece nregistrrile n acest fiier nu trebuie s respecte o anumit
ordine. Pentru a putea reexploata spaiile nregistrrilor suprimate, se
construiete o list de spaii libere. ns, fiecare inserare implic i
actualizarea imediat (on-line) a indecilor, fapt ce poate influena negativ
executarea acestei operaii.
Modificrile sunt fcute direct n fiierul de date i ele, de asemenea,
provoac actualizarea indecilor (numai n care se indic cmpurile
modificate).
Excluderea nregistrrilor poate fi fizic, cu actualizarea on-line a
indexului, sau logic, cu utilizarea etichetelor. Ultima variant implic,
ulterior, tergeri fizice cu scopul reutilizrii spaiului eliberat.
Parcurgerea secvenial este puin ineficient, dar nu influeneaz
executarea sistemului n general. Ordinea nregistrrilor depinde de cheia
aleas i este dictat de informaiile din index (nivelul cel mai intern conine
ordinea nregistrrilor). Problema este c fiecare pereche <cheie, adres>,
n ultimul nivel direcioneaz accesul la fiierul de date (deoarece
nregistrrile sunt dispersate fr ordine i nu sunt utilizate blocuri de
nregistrri continue). Pentru parcurgerea secvenial, este de ajuns
analizarea direct a ultimului nivel al indexului (nu este necesar navigarea,
pornind de la nivelurile externe). Parcurgerea secvenial dup o cheie care
nu este index necesit un fiier auxiliar i tehnici de ordonare.
Un mare avantaj al fiierelor indexate este posibilitatea de consultare
dup mai multe chei, ceea ce deosebete aceast organizare de celelalte.
Consultrile aleatorii (pentru o singur nregistrare), de asemenea, sunt
fcute rapid. Acum operaia de parcurgere secvenial, cu toate c nu poate
fi fcut n mod optimal, nu este foarte lent ca operaia respectiv n
organizarea indexat secvenial, ntruct nu trebuie s se parcurg liste
nlnuite.
Un dezavantaj este necesitatea de actualizare on-line a indecilor,
ceea ce poate influena executarea operaiilor, dar, pe de alt parte,
permite aplicarea lor n sistemele cu utilizare nentrerupt, cum sunt bazele
de date. ns, o dat cu implementarea indecilor eficieni i moderni
(precum se va vedea n continuare), se poate soluiona aceast problem.
Alt dezavantaj este c organizarea indexat cere mult spaiu pentru
stocarea tuturor indecilor. Cu toate acestea, fiierele indexate sunt larg
utilizate n majoritatea SGBD-urilor.

Fiiere inversate

Nu toate cutrile n bazele de date se fac dup cheia primar. Dac
un atribut sau un grup de atribut apare des n cereri, atunci, pentru acest
atribut sau grup de atribute, se construiete un index secundar, ce permite
accesul rapid la nregistrrile corespunztoare valorilor date.
Un fiier cu un index secundar, corespunztor unui atribut sau grup
de atribute X, se spune c este fiier inversat n raport cu X. n indexul
secundar, nregistrrile sunt indicate fie prin pointeri la ele, fie prin valorile
cheilor primare corespunztoare lor.
Referirea la nregistrri prin pointeri (list inversat) are avantajul
accesului mai rapid la date, dar produce constrngeri din cauza fixrii
nregistrrilor n locul unde au fost introduse, la nivel de bloc sau la nivel de
nregistrri. Referirea prin cheia principal asociat are dezavantajul unui
acces lent, dar nu mai fixeaz nregistrrile.
De exemplu, o list inversat dup cmpul Departament al unui fiier
de funcionari ai unei ntreprinderi va conine toate valorile acestui cmp, i
fiecreia din aceste valori i va fi asociat o list cu adrese sau pointeri ale
nregistrrilor funcionarilor care conin valoarea specificat n cmpul
Departament. Astfel, lungimea fiecrei liste va fi numrul de funcionari
care lucreaz n departamentul respectiv.
De fiecare dat cnd o nregistrare este inclus, exclus sau
modificat, fiierul inversat, de asemenea, trebuie s fie modificat. O
alternativ, precum s-a menionat, este stocarea nu a adresei, ci a cheii
primare a fiecrei nregistrri. n acest mod, se evit actualizarea indexului
cnd are loc reorganizarea fizic a fiierului (ordinea nregistrrilor). ns,
aceast opiune frneaz executarea consultrilor, o dat ce nu se cunoate
adresa, este necesar localizarea ei n alt mod (sau de alt index, sau
secvenial).
O problem ce diminueaz calitile necesare pentru viabilitatea
fiierelor inversate apare cnd valorile cmpului pe care e definit indexul
secundar nu posed repetri de valori. Alt problem ce trebuie s fie
considerat este c listele, n general, nu au lungime fix (numrul de
nregistrri pentru fiecare valoare se poate schimba cu utilizarea
sistemului).

Indeci Bitmap

Un index bitmap este o variant a indexului secundar care asociaz
fiecrei valori a atributului indexat o secven de bii, n loc de o list de
adrese sau chei. Fiecare bit identific o nregistrare concret a fiierului.
Dac nregistrarea n cmpul atributului indexat are valoarea specificat,
atunci bitul respectiv conine valoarea 1. Un bit cu valoarea 0 semnific
faptul c nregistrarea nu conine valoarea specificat n cmpul indexat.
Lungimea secvenei de bii este numrul maximal de nregistrri n
fiier. Dac fiierul crete mult sau are loc reorganizarea fizic a
nregistrrilor, indexul bitmap trebuie s fie refcut.
Dac se caut nregistrrile cu valoarea v a atributului indexat, este
suficient s fie examinat bitmap-ul asociat valorii v, cutai toi biii cu 1 i
s fie accesate nregistrrile respective. Un index bitmap este foarte
eficient, dac numrul de valori posibile ale atributului indexat este mic.
Unul din avantajele indecilor bitmap este c nu ocup mult spaiu.
Un index bitmap este foarte mic n dimensiuni, n raport cu un B-arbore
construit pe acelai atribut. Este foarte util n aplicaii de tipul
nmagazinrilor de date care conin volume mari i clasific informaiile
conform unor atribute definite pe domenii mici de valori. Unele interogri
pot fi executate foarte eficient, uneori fr a apela la fiierul de date.
O dat ce o nregistrare este inclus, exclus sau modificat (n
cmpul respectiv), bitmap-ul, de asemenea, trebuie modificat. Acest tip de
index poate fi folosit eficient i pentru cmpurile atributelor multivaloare.

Arborii binari

Arborii, n general, formeaz o clas de indeci destul de eficieni i
mult utilizai, astzi, n bazele de date. Fiecare nod trebuie s posede o
cheie i pointeri (vizi sau ndreptai spre nodurile fii).
Un arbore important este arborele binar. n el, fiecare nod poate avea
cel mult doi fii. n calitate de index arborele binar poate fi organizat precum
urmeaz. Dat fiind faptul c fiecare nod posed o cheie, nodul fiu din stnga
trebuie s conin o cheie mai mic dect a nodului printe, n timp ce
nodul fiu din dreapta trebuie s conin o cheie mai mare (i aa succesiv
pn la frunze).
Dac se caut o nregistrare, localizarea ei se face, analiznd nodurile
fii. Astfel, pentru gsirea unei chei, se parcurge arborele de la rdcin,
mergnd spre stnga, dac cheia cutat este mai mic dect cheia nodului
curent, sau spre dreapta dac cheia cutat este mai mare (pn se
ntlnete cheia cutat sau pn cnd nu mai sunt noduri fii).
Inserarea cheii n arbore este fcut dup o anumit frunz (n
calitate de nod fiu al unui nod frunz), n locul respectiv, aplicnd aceleai
proceduri ca n procesul de cutare (explicate anterior). Excluderea, ns, a
unei chei presupune substituirea ei cu alta (mai mic sau mai mare dect
urmtoarea, care se gsete n nodul frunz respectiv). Modificarea valorii
cheii indexului este realizat n arbore de o excludere a cheii vechi i o
includere a cheii noi.
Sunt dou soluii de stocare a adreselor nregistrrilor:
adresa se plaseaz n fiecare nod al arborelui, formnd perechea
<cheie, adres>;
adresa se pstreaz numai n nodurile frunze, adic unele chei
sunt repetate i n calitate de noduri frunze.
Soluia cnd fiecrei chei i este asociat o adres permite accesarea
nregistrrii n momentul n care s-a gsit cheia ei n arbore i, prin urmare,
nu este necesar parcurgerea arborelui pn la nodurile frunze. A doua
variant, cnd adresele sunt asociate numai nodurilor frunze, faciliteaz
consultarea secvenial a nregistrrilor (dup cheia indexului), deoarece
nodurile frunze pot fi nlnuite, formnd o list.
Arborele binar este puin folosit n calitate de index n SGBD-uri,
deoarece dup o serie de operaii de actualizare poate deveni nebalansat.
Chiar dac cheia unui nod rdcin are o valoare intermediar, arborele
poate avea unele ramuri mai lungi sau mai adnci dect altele, fapt ce
poate genera un dezechilibru n executarea operaiilor. Evident c acest
lucru poate fi depit, dac se va recurge permanent la reorganizarea
arborelui. Dar aceast operaie este laborioas i sunt antrenate n ea toate
nodurile arborelui. Cu att mai mult c baza de date este un sistem care
este interogat ncontinuu i nu exist rgaz pentru a face astfel de
restructurri.

B-arbori

B-arborele este un tip de index n form de arbore, care ntotdeauna
este balansat. Cutarea nregistrrilor este similar pentru orice cheie,
indiferent de localizarea ei n arbore (fie n nodul rdcin, sau n nodul
intermediar sau frunz).
Fiecrui B-arbore i se asociaz un numr numit ordinul arborelui, care
determin numrul maximal i numrul minimal de noduri frunze pe care le
poate conine. n afar de aceasta, un B-arbore (de ordinul m) trebuie s
respecte urmtoarele reguli:
fiecare nod posed m sau mai puini subarbori;
fiecare nod, cu excepia rdcinii, posed m/2 (ia o valoare
ntreag) sau mai muli subarbori;
nodul rdcin posed, cel puin, doi subarbori nevizi, cu excepia
cnd este un nod frunz;
orice nod frunz se gsete la aceeai distan de nodul rdcin
i toi subarborii lor sunt vizi;
ntr-un nod cu k subarbori se stocheaz k-1 nregistrri;
orice nod de derivare (care nu este frunz) posed exclusiv
subarbori nevizi.
Consultarea dup cheie este fcut ca n orice arbore: se parcurge
subarborele stng, dac cheia cutat este mai mic dect cheia analizat
(menionm c un nod poate avea mai mult de o cheie) sau se parcurge
subarborele drept, dac cheia este mai mare. Acest proces continu pn se
ntlnete cheia cutat sau se ntlnete subarborele vid).
Pentru a insera o cheie ntr-un B-arbore, se verific dac argumentul
de cutare nu coincide cu o cheie deja existent. Adic, mai nti, se face
consultarea arborelui.
Includerea unei chei este fcut ntr-un nod frunz, dac acesta are
spaiu suficient (nodul se gsete n limitele date de ordinul arborelui). Dac
nu este spaiu suficient pentru inserarea cheii, trebuie s se produc
divizarea nodului (splitt) i formarea a dou noduri noi. Cheia valorii
intermediare trebuie s urce, adic trebuie s fie inclus n nodul printe, cu
coreciile corespunztoare n pointerii precedent i urmtor, din aceast
cheie, n nodul printe (acum pointerii devin indicatori spre nodurile create).
Nodul nou din stnga va conine cheile mai mici dect cea intermediar i
nodul din dreapta, cheile mai mari.
Dac n nodul printe nu este spaiu pentru includerea cheii
intermediare, care urc, nodul printe trebuie divizat (aceeai procedur).
Acest proces poate provoca divizri succesive, pn la crearea unei noi
rdcini (din inexistena unui nod printe, cheia care urc formeaz un nou
nod rdcin).
Excluderea unei chei este un proces mai complicat. Mai nti se
localizeaz cheia respectiv. Aciunile de mai departe depind de faptul dac
cheia se gsete ntr-un nod frunz sau nu.
Dac cheia se gsete ntr-un nod frunz, ea este exclus. Rmne s
se verifice dac nodul frunz se gsete n interiorul limitelor admise. Dac
numrul de chei este mai mic de limita permis de ordinul arborelui, nodul
afectat trebuie s solicite o cheie de la nodul frate din stnga sau nodul
frate din dreapta (dac din unul din noduri poate fi extras o cheie, iar
nodul respectiv s se ncadreze n limitele admise). Cheia solicitat de la un
nod frate trebuie s fie una de vrf (cea mai mare n nodul frate din stnga
sau cea mai mic n nodul frate din dreapta). Atunci, aceast cheie se ridic
la nodul printe, substituind-o pe cea care se gsea ntre pointerii celor doi
frai afectai. Cheia substituit este cobort n nodul de unde a fost exclus
cheia specificat (cheia cobort este poziionat n ordinea respectiv).
Dac, ns, nici un nod frate nu poate elibera o cheie pentru nodul
din care s-a exclus cheia specificat, se produce concatenarea (unsplitt)
ntre nodul afectat i un nod frate. Atunci, cheia nodului printe care se
gsete ntre identificatorii frailor coboar pentru a fi cheie intermediar
ntre cheile nodurilor frai.
Dac nodul printe, dup pierderea unei chei, conine mai puine chei
dect limita admis, el trebuie, de asemenea, unit la unul din fraii si,
aplicnd aceeai procedur de concatenare. Acest proces poate provoca o
concatenare n cascad, pn este eliminat nodul rdcin (rdcina nou
fiind nodul obinut din concatenarea nodurilor fiu).
n cazul cnd cheia ce trebuie exclus se gsete ntr-un nod de
derivare, aceasta va trebui s fie substituit de cheia imediat mai mare sau
mai mic. Or, pentru aceasta e destul de parcurs unul din subarbori pn la
nodul frunz mai apropiat. Dac nodul frunz, dup pierderea cheii (pentru
substituirea celei excluse), conine mai puine chei dect limita admis,
procedura de corecie este aceeai ca i n cazul excluderii cheii din nodul
frunz.
Trebuie menionat c datele nregistrrilor (cmpurile) sunt pstrate
ntr-un fiier separat. Aadar, fiecare nod are, n afar de pointeri spre
nodurile fii, un pointer spre nregistrarea respectiv de date.
O alternativ este pstrarea n noduri i a datelor nregistrrilor.
Avantajul acestei structuri este c nu mai e nevoie de nc o accesare
pentru gsirea nregistrrilor. Pe de alt parte creterea dimensiunii
nodurilor face ca operaiile de divizare i concatenare s fie mai lente.

B
+
-arbori

Indecii de tipul B+-arbore sunt asemntori celor de tipul B-arbore,
cu deosebirea c toate cheile din nodurile derivate sunt, de asemenea,
replicate i n nodurile frunze. Aceasta d posibilitatea ca nodurile frunze s
fie nlnuite, formnd o list (fiecare nod are cte un pointer pentru
nodurile precedent i urmtor). Aceast list faciliteaz operaia de
parcurgere secvenial a nregistrrilor (dup cheia indexului).
Ctigul n urma aplicrii B+-arborelui este cu att mai spectaculos,
cu ct numrul nregistrrilor crete. Se poate observa o cretere foarte
rapid (exponenial) a numrului de nregistrri indexate n funcie de
numrul nivelurilor indexului i invers, o cretere foarte mic (logaritmic) a
numrului de niveluri n funcie de numrul nregistrrilor. ntruct costul
unei cutri dup cheie este proporional cu numrul nivelurilor i nu cu
numrul nregistrrilor, indexarea permite micorarea considerabil a
timpului de cutare.
B-arborii ofer o mai mare flexibilitate de gsire a adresei n fiierul
de date, unde este stocat nregistrarea i asigur o mai mare eficien, n
principal, n operaiile de inserare i eliminare a nregistrrilor. n plus, B+-
arborii nu exclud posibilitatea de parcurgere secvenial a datelor. Pentru
aceasta, este suficient s se parcurg mulimea de noduri frunze, folosind
lanul de pointeri ce le leag. Deci, accesul la fiierele cu un index B+-
arbore poate fi fcut n mod secvenial i aleatoriu.
Totodat, se observ o simplificare n structura general a fiierului,
deoarece fiierele indexate sunt scutite de utilizarea spaiului de tranzacii.
Dac fiierele organizate secvenial i indexat secvenial trebuiau
reorganizate periodic pentru a aduce ordinea logic la cea fizic, n fiierele
indexate, ordinea fiierului de date este neesenial. Aceasta se datoreaz
faptului c nregistrrile sunt accesate prin index, fr a avea de-a face cu
configuraia fizic a acestora.
Cu toate acestea, o mare problem ntlnit n fiierele cu organizare
de tip indexat este necesitatea de actualizare a tuturor indecilor cnd, de
exemplu, o nou inserare este fcut.


28.7 Fiiere cu dispersie

ntr-un fiier cu dispersie exist o relaie predefinit ntre valoarea
cheii utilizate pentru identificarea unei nregistrri i localizarea nregistrrii
n fiier. nregistrrile nu sunt, neaprat, ordonate fizic n acord cu valoarea
cheilor. nregistrrile sunt stocate pe dispozitivele externe de stocare de
acces direct i recuperate prin utilizarea acestei legturi.
Acesta este tipul de organizare care conine numai un spaiu de date
pentru stocarea nregistrrilor. nregistrrile sunt identificate de o cheie
principal, a crei adres fizic, pentru stocare, este dat de valoarea cheii
sau de o valoare calculat, pornind de la valoarea cheii. ntr-un fiier cu
organizare dispersat, de obicei, cheia este de tip numeric, pentru a calcula
adresa i localiza nregistrarea n spaiul de date.

Caracteristicile fiierelor cu dispersie

Fiierele cu dispersie prezint o organizare a datelor destul de des
utilizat n tehnicile de proiectare fizic a bazelor de date, mai ales n
modelele orientate pe obiecte. Ele necesit timp, relativ, redus de acces al
nregistrrilor individuale, ns lectura secvenial a unui fiier cu dispersie
este o sarcin anevoioas. Exist dou forme de organizare a fiierelor cu
dispersie:
cu adresare direct;
cu adresare indirect.
Caracteristica principal a fiierelor cu dispersie este c adresa
fiecrei nregistrri e determinat n funcie de valoarea cheii primare a
nregistrrii. Astfel, este utilizat o funcie de dispersie (hash function),
care, pentru fiecare valoare a cheii C, returneaz adresa h(C) ntr-un spaiu
de stocare, unde nregistrarea respectiv trebuie plasat.
Aceasta este cea mai rapid metod de acces la date, numai dac
cutarea se petrece cu condiia de egalitate asupra cmpului de dispersie.
Funcia de dispersie trebuie s in cont de spaiul alocat fiierului,
pentru a realiza o distribuire uniform a nregistrrilor n spaiul rezervat.
Exist funcii care pstreaz ordinea (cheii) i care nu pstreaz ordinea
(cele mai populare). ntre ultimele exist funciile deterministe (o singur
adres poate fi generat de o cheie) i funcii nedeterministe (cnd mai
mult de o cheie poate genera aceeai adres, fapt care se numete
coliziune).
Pentru includerea n fiier a unei nregistrri, este suficient s se
calculeze adresa ei, aplicnd valoarea cheii n funcia de dispersie aleas.
Dac apare o coliziune, adic, dac exist o alt nregistrare pe aceeai
poziie, trebuie s fie utilizate unele proceduri de tratare a coliziunilor.
Pentru excluderea unei nregistrri, este de ajuns s se gseasc
nregistrarea prin aceeai metod i s se exclud datele ei sau s se
marcheze c e exclus. Procesul de modificare se petrece n mod analog.
Pentru modificri n cheia primar se apeleaz la operaia de excludere (a
cheii vechi) urmat de o operaie de includere (a cheii noi).
Exist eventualitatea ca funcia de dispersie s produc, pentru dou
sau mai multe valori diferite ale cheii, aceeai adres. n acest caz, prima
nregistrare inclus rmne n domeniul de date, iar pentru celelalte se
apeleaz la o procedur de prelucrare a coliziunilor pentru a fi incluse n
spaiul de coliziuni. Exist mai multe proceduri de tratare a coliziunilor:
utilizarea unui fiier de tranzacii (overflow), unde sunt plasate
nregistrrile excedentare (care nu pot fi incluse n fiierul
principal, deoarece, deja, exist alt nregistrare pe aceeai
adres), formnd o list nlnuit;
alocarea nregistrrii n poziia urmtoare liber (fapt ce poate
mri probabilitatea apariiei coliziunilor);
nregistrrile care se ciocnesc sunt alocate n locurile libere ale
aceluiai fiier, formnd liste nlnuite;
utilizarea unei a doua funcii de dispersie, pentru poziionarea
nregistrrii pe alt adres (de asemenea, mrete probabilitatea
coliziunilor care, la rndul lor, necesit alt mod de tratament al
coliziunilor);
utilizarea blocurilor adresa generat de funcia de dispersie
aparine unui bloc unde nregistrrile pot fi plasate n form
serial.
Consultarea nregistrrilor (dup cheia primar) este mai eficient n
acest tip de organizare, dar trebuie s se in cont de procedura aleas
pentru tratarea coliziunilor.
Dezavantajele acestui tip de organizare sunt: imposibilitatea de
consultare dup mai multe chei (trebuie s fie utilizate mpreun alte
mecanisme) i necesitatea de rearanjare (reorganizare), cnd fiierul crete
prea mult (multe includeri). n acest caz, trebuie aleas o alt funcie de
dispersie i toate nregistrrile repoziionate de funcia nou.
Pentru a diminua probabilitatea de apariie a coliziunilor, se poate
aloca un spaiu mai mare pentru fiier (un spaiu suplimentar de 20%-
30%). O bun funcie de dispersie, de asemenea, poate diminua coliziunile
(dar nu le poate evita). Acest tip de organizare este optimal pentru
aplicaiile care au nevoie de consultri aleatorii rapide (ale unor nregistrri
specifice) i cnd fiierul nu crete mult.
Dac fiierul crete mult, pot fi utilizate alte tehnici. Tehnicile
cunoscute ca dispersia dinamic i dispersia extensibil utilizeaz blocuri
pentru alocarea nregistrrilor. Dac blocul a crescut prea mult (pn
aproape de limita sa), el trebuie s fie divizat i nregistrrile lui
redistribuite n blocurile nou-produse.
Cu dispersia dinamic, realocarea nregistrrilor n blocurile noi este
dictat de o funcie nou. Acum, pentru gsirea unei nregistrri, este
necesar examinarea istoriei realocrii (retrecnd toate funciile deja
utilizate).
n cazul dispersiei extensibile, realocarea este determinat de
creterea cheii. ntr-adevr, cheia produs de funcia de dispersie este de
lungime fix, dar codificat de o secven de bii de lungime suficient de
mare. Numrul de bii ce este analizat pentru identificarea blocului
nregistrrii se modific (se majoreaz cnd blocurile sunt divizate i se
diminueaz n cazul fuzionrii blocurilor).
Aceste dou tehnici implic reorganizarea unei pri a fiierului, de
aceea nu influeneaz mult funcionarea general a sistemului.
Dat fiind faptul c nregistrrile nu sunt ordonate, ci distribuite n
form aleatorie n fiier, structura fiierului cu dispersie nu funcioneaz
bine pentru consultri secveniale (parcurgerea secvenial a nregistrrilor
n ordinea cheii primare).
Dac exist o aa necesitate, poate fi utilizat tehnica dispersia
indexat. Aceasta este o combinare ntre organizrile de tip indexat i
dispersat. n dispersia indexat, valoarea produs de funcia de dispersie nu
este adresa direct a nregistrrii de date, ci o adres n fiierul index (cu
perechea care reprezint cheia i adresa nregistrrii).
Fiierul index funcioneaz ca cel mai intern nivel al organizrilor de
tip indexat, unde cheile apar ordonate. Consultarea secvenial poate fi
fcut asupra acestui fiier index, n timp ce, pentru cele de consultare
aleatorie apare numai o accesare n plus. O alt alternativ poate fi
nlnuirea nregistrrilor cu utilizarea pointerilor.
Astfel, pentru fiierele cu dispersie exist dou moduri de acces:
secvenial, care reprezint o lectur secvenial a datelor,
conform ordinii dictate de cheie.
aleatoriu, care localizeaz o nregistrare dup adresa calculat cu
ajutorul unei funcii de dispersie, pornind de la valoarea cheii de
acces.

Adresarea direct

Adresa direct, n forma sa mai simpl, este o adres hardware, fie
relativ, fie absolut, care permite sistemului s acceseze nregistrarea
corespunztoare. Adresa hardware a unei nregistrri este format din
numrul cilindrului, numrul pistei i din poziia nregistrrii pe pist.
O abordare mai simpl a acestui tip de organizare const n tratarea
valorii cheii ca un numr tradus de sistem ntr-o adres hardware relativ.
De exemplu, fie un fiier cu organizare direct pstreaz nregistrri
cu valorile cheii primare ntre 0 i 9999. Dac valoarea cheii este tratat ca
numr relativ al nregistrrii, atunci trebuie rezervat un spaiu pentru 1000
nregistrri, care corespunde unei valori posibile a cheii ntre 0 i 9999
inclusiv.
Adresarea direct semnific faptul c sistemului i este furnizat
adresa fizic a nregistrrii cutate, pentru a-i permite recuperarea direct a
nregistrrii. Adresa furnizat poate fi att fizic a hardware-ului (numrul
cilindrului, numrul pistei, numrul nregistrrii), ct i un numr de adres
relativ (poziia ntr-un fiier). A doua opiune este mai utilizat, i din
faptul c adresa relativ poate fi automat tradus ntr-o adres fizic.
Tratarea unei valori a cheii ca numr de adres relativ are un
dezavantaj. De exemplu, dac un fiier cu organizare direct are nregistrri
cu valorile cheii ntre 0 i 9999, trebuie rezervate 10000 nregistrri, fiecare
corespunznd unei valori posibile a cheii. Aceast rezerv trebuie fcut,
chiar dac n fiier exist numai o nregistrare (cheia 9999, de exemplu).
Spaiul neutilizat, n aceast organizare, poate fi foarte mare. Pentru
aceasta administratorul bazei de date trebuie s analizeze necesitatea real
de adrese directe n ce privete spaiul real ocupat de fiier i spaiul irosit.
Dac spaiul liber, procentual, nu este mare, poate fi compensat de
avantajele utilizrii adresrii directe.
Cnd numrul de chei posibile este, relativ, aproape de numrul real
de chei, aceast form de adresare este foarte eficient. Dar, aproape
ntotdeauna, numrul real de chei este mult mai mic dect numrul de
spaii de nregistrri care trebuie pstrate. Cnd aceasta se ntmpl, pentru
accesarea unui fiier cu dispersie, trebuie s fie utilizate consultarea
dicionarului sau adresarea indirect. Pentru ca sistemul s poat converti
aceast valoare ntr-o adres hardware, trebuie cunoscute urmtoarele
mrimi: valoarea cheii, numrul de cilindri pe dispozitivul extern de stocare,
numrul de nregistrri pe pist, numrul de piste pe cilindru, adresa
hardware absolut a fiierului.
Pentru a gsi adresa relativ i absolut a unei nregistrri sunt trei
etape trecute de sistem:
valoarea cheii se mparte la numrul de nregistrri pe pist, unde
ctul este numrul pistei relative a nregistrrii, iar restul este
poziia relativ a nregistrrii pe aceast pist;
numrul pistei relative a nregistrrii este mprit la numrul de
piste pe cilindru i se obine numrul relativ al cilindrului i pista
relativ a cilindrului (restul);
adresa hardware absolut a nregistrrii se gsete, dac se
adaug adresa hardware relativ a nregistrrii la adresa
hardware absolut a fiierului.

Adresarea indirect

Adresarea indirect presupune c se aplic o funcie de transformare
a valorii cheii ntr-o adres direct, care poate fi utilizat de sistemul de
gestiune pentru localizarea nregistrrii dorite. Aceasta, spre deosebire de
adresarea direct, unde nu se face nici o transformare a valorii cheii nainte
de utilizarea ei de sistem.
n fiierele cu dispersie, cu adresare indirect, nregistrrile se
grupeaz n clase. Apartenena unei nregistrri la una din clase este
determinat, n funcie de valoarea pe care o are cheia nregistrrii.
Spaiul necesar pentru stocarea claselor de nregistrri este divizat n
blocuri de stocare. Un bloc de stocare poate conine una sau mai multe
nregistrri logice, capacitatea lor fiind determinat de proiectant. Funcia
de dispersie calculeaz, de fapt, adresa primului bloc al clasei, unde este
stocat nregistrarea. n implementarea fiierelor cu dispersie se
construiete o list numit directoriu cu pointeri la blocul de ncepere
corespunztor fiecrei clase, figura 28.12.
Funcie de dispersie Bloc
1


2

Cheie
h .
.
N


Directoriu

Figura 28.12 Un fiier cu dispersie

Funcia de dispersie, de obicei, poate mapa diferite valori ale cheii pe
aceeai adres a spaiului de stocare, provocnd fenomenul numit coliziune.
Evident c nregistrrile care au aceeai adres produs de funcia de
dispersie aparin aceleiai clase. Stocarea nregistrrilor ce aparin unei
clase n blocuri depinde de metodele de soluionare a coliziunilor.
Principala problem ce ine de adresarea indirect este alegerea
funciei h, care transform valoarea C a cheii unei nregistrri n adresa A,
care i corespunde n fiier. O alt problem este gsirea unei metode
adecvate de soluionare a coliziunilor i de plasare a nregistrrilor
excedentare n blocuri. Astfel, algoritmul de lucru cu fiierele cu dispersie
presupune, printre altele, dou activiti: maparea (utiliznd funcia de
dispersie) valorii cheii ntr-o adres absolut sau relativ i citirea
nregistrrilor excedentare.
Dac proiectantul alege un spaiu mic de stocare a primului bloc din
fiecare clas de nregistrri, apare un numr relativ nalt de coliziuni, fapt ce
produce lecturi suplimentare pentru localizarea nregistrrii dezirabile n
spaiul de nregistrri excedentare. O capacitate de stocare mai mare
provoac mai puine coliziuni, dar mult spaiu rmne nevalorificat. n
practic, capacitatea spaiului de stocare depinde de caracteristicile
dispozitivului secundar de stocare a fiierului cu date. Raportul dintre
numrul de nregistrri existente n fiier i numrul total de locuri
disponibile pentru nregistrri n fiier se numete grad de ncrcare a
fiierului. Pe msur ce gradul de ncrcare crete, probabilitatea unei
nregistrri, ce trebuie adugat, de a deveni una excedentar (care
provoac o coliziune), de asemenea, crete.
Eficiena unui fiier cu dispersie, cu utilizarea adresrii indirecte, este
influenat de mai muli factori:
dimensiunea spaiului de stocare;
gradul de ncrcare;
valorile cheilor;
funcia de dispersie;
metoda de soluionare a coliziunilor;
metoda de citire a nregistrrilor excedentare.

Calcularea adresei

Exist diverse tehnici pentru transformarea cheii ntr-o adres.
Pot fi considerate dou tipuri de funcii de dispersie, primul fiind
constituit din funcii deterministe care pentru dou valori diferite ale cheii
produc adrese diferite. Acest tip de funcii prezint avantaje evidente. Dar,
n practic, pentru un numr mare de nregistrri, este imposibil de gsit o
funcie determinist simpl. Acele funcii care pot fi folosite sunt aa de
complexe, c elimin toate avantajele accesului direct. n afar de
necesitatea de adaptare la fiecare inserare suferit de fiier, de obicei,
produc adrese necontinue, ceea ce duce la utilizarea unui spaiu larg,
similar adresrii directe. Din acest motiv, funciile deterministe nu prezint
un mare interes practic.
Al doilea tip formeaz funciile nedeterministe, care produc pentru
fiecare valoare a cheii o singur valoare a adresei, iar, uneori, pentru valori
distincte ale cheii, aceeai adres, ceea ce constituie o coliziune. Funciile
nedeterministe pot fi proiectate i cu scopul de a atinge unele obiective
secundare, obiective care nu sunt incompatibile:
pstrarea ordinii nregistrrilor dup valoarea cheii de acces;
mrirea gradului de unicitate a adreselor produse, adic,
distribuirea nregistrrilor n fiier, cu o mare uniformitate
posibil.
O funcie de dispersie nedeterminist care nu ine cont de ordinea
cheii se mai numeete funcie de randomizare i are ca obiectiv distribuirea
uniform a nregistrrilor n fiier.
Funcia de dispersie restul de la mprire. Aceast funcie de
dispersie este utilizat frecvent. n calitate de valoare a funciei de dispersie
se folosete restul de la mprirea unei chei la un numr ntreg N:
1 mod ) ( + = N C C h . Aici la rezultatul mpririi se adaug 1 pentru a obine o
valoare a funciei ntre 1 i N.
Evident c eficiena distribuirii cheilor depinde mult de valoarea lui N.
Astfel, contraindicat ca N s fie puterea bazei unui sistem de numeraie,
deoarece, n acest caz, valorile funciei de dispersie vor fi reprezentate de
ultima cifr a cheii. Cele spuse sunt adevrate i pentru cheile alfanumerice.
Dac N=2
8
, de exemplu, valoarea funciei de dispersie va fi ultimul caracter
al cheii. Pentru a depi concentrarea cheilor n jurul unor adrese, se
recomand ca N s fie un numr prim.
Deseori, mulimea de chei reprezint nite secvene de progresii de
tipul XXA,XXB, sau FT01, FT02, Funcia de dispersie restul de la
mprire transform astfel de chei n adrese succesive. O asemenea situaie
poate fi considerat destul de satisfctoare.
Metoda nmulirii. Fie cheia C este reprezentat n forma unui numr
binar i fie N=2
n
. Se nmulete o fracie o cu C i se ia partea fracionar
care este notat prin {Co}, iar n calitate de valoare a funciei de dispersie
se folosesc numai primii n octei. Cu alte cuvinte, h(C)=N{Co}, unde x
este cel mai mare numr ntreg mai mic dect x.
Se recomand a se folosi n calitate de valoare o un numr iraional,
aproape de lungimea unui cuvnt. De exemplu, dac o este reprezentat de
2 / ) 1 5 ( = o , atunci segmentul [0,1] se mparte foarte bine la {o},{2o},.
Cu alte cuvinte, orict de mrunt s-ar diviza segmentul, lungimea
segmentelor obinute dup divizare nu se vor exprima prin mai mult de trei
valori o
C
, o
C+1
, o
C+2
. n cazul divizrii urmtoare segmentul de lungime o
C
se
mparte n segmente cu lungimile o
C+1
, o
C+2
. Aceast proprietate, n cazul
aplicrii metodei nmulirii, permite a obine rezultate bune.
Cerina N=2
n
pentru calcularea funciei de dispersie h(C) nu este
obligatorie. Trebuie menionat c, dac o=1/N, atunci aceast metod este
echivalent cu metoda restul de la mprire.
Foarte aproape de aceast metod de dispersie este metoda
mijlocul ptratului, n care, n calitate de valoare a funciei de dispersie
h(C), se folosesc n octei din mijlocul numrului C
2
. i aceasta este o
metod de dispersare, dar, dup muli parametri, cedeaz metodei
nmulirii.
Metoda transformarea sistemelor de numeraie. Metoda de calculare
a valorii funciei de dispersie presupune transformarea valorii cheii C,
reprezentat n sistemul de numeraie n baza p, , ntr-o
valoare reprezentat n sistemul de numeraie n baza q cu constrngerea s
asupra ordinii rezultatului: . Aici p i q sunt numere
pozitive, astfel, c p<q.
...
2
2 1 0
+ + + = p a p a a C
1 s
1 1 0
... ) (

+ + + =
s
q a q a a C h
Pentru calcularea valorii funciei de dispersie h(C), sunt necesare s
operaii de nmulire sau mprire. Prin urmare, complexitatea (numrul de
operaii) acestei metode este mai nalt dect a metodei nmulirea.
Metoda mprirea polinoamelor. Fie cheia C, exprimat n sistemul
binar de numeraie, se scrie i fie N=2
n
. Cheia binar
C se reprezint n forma unui poli
0 1
b t b + , pstrnd
aceiai coeficieni. Acum se determin restul de la mprirea acestui
polinom la polinomul constant
0 1
... p t p + + + . Restul
obinut se consider din nou n sistemul binar de numeraie i se folosete
n calitate de valoare a funciei de dispersie h(C). Pentru calcularea restului
de la mprirea polinoamelor, se folosete aritmetica polinomial dup
modulul 2. Dac n calitate de P(t) este ales un polinom ireductibil simplu,
atunci, pentru dou chei foarte aproape, dar nu egale, C
1
=C
2
, ntotdeauna
se va realiza condiia h(C
1
)=h(C
2
). Aceast funcie de dispersie posed
proprieti mai puternice de dispersare a mulimii de che
0 1 1
1
2 ... 2 b b b C
m
m
+ + + =

nom ) ( b t C =
de forma ) ( t t P
n
+ =
... t
m
m
+ +
1
1
t p
n
n

i dect
preced
poate fi critic, ns, pentru memoria
secund , acest timp poate fi neglijat.
Tratarea coliziunilor

i diferite ale cheii de acces sunt
transf
cutar
terilor, aceeai
ecv s poat fi parcurs. Procedura poate ar astfel:

2
3.1.
ceasta e
3.2.
ar dac e
s);
entele.
Trebuie menionat c, n fiierele cu dispersie, transformrile cheii n
adres sunt similare funciilor de dispersie utilizate pentru cutarea n
tabelele stocate n memoria principal. Deosebirea const n caracteristicile
accesului la memoria secundar, care difer de cele ale accesului n
memoria intern accesibil direct. Pentru funciile de dispersie n memoria
principal timpul de calculare a adresei
ar

Tratarea coliziunilor este unul din aspectele mai importante n
adresarea indirect i este consecina utilizrii funciilor nedeterministe
pentru transformarea valorilor cheii n adrese ale fiierului. Se spune c
exist o coliziune cnd dou valor
ormate n aceeai adres.
Deoarece pe o adres se poate stoca o singur nregistrare, este
necesar stabilirea unei proceduri pentru a alege o alt adres, unde va fi
plasat nregistrarea care a provocat coliziunea. Aceast procedur se aplic
i n operaia de acces, dac, pe adresa produs n baza argumentului de
e, se gsete o nregistrare cu o cheie diferit de cea a argumentului.
Soluiile mai frecvent utilizate sunt adresarea deschis i nlnuirea.
Tratarea cu adresare deschis. Aceast metod de soluionare a
coliziunilor presupune c se folosete o anumit regul de parcurgere a
nregistrrilor. O dat cu apariia unei coliziuni la operaia de inserare, este
fcut o cutare n fiier pentru localizarea unei adrese libere, unde va fi
stocat nregistrarea. Procesul de inserare se supune unei secvene
predefinite, care este urmat i n timpul accesului la nregistrare. Regula de
cutare trebuie s fie astfel, nct, chiar n lipsa poin
s en ta

1. i=0
. A=h
i
(C):
Dac adresa A este liber, stop (dac aceasta e procedura de
inserare, algoritmul se termin cu succes, ns, dac a
procedura de cutare, nseamn c aa cheie nu exist);
Dac cheia de pe adresa A este egal cu C, stop (dac este
procedura de inserare, inserarea a doua nu se mai face, i
procedura de cutare, algoritmul se termin cu succe
4. n caz contrar coliziune; i:=i+1 i se trece la pasul 2.

minate anterior, mai departe se examineaz celelalte
funcii
poate fi realizat cu una din urmtoarele
;
Aceasta es
n sensul larg,

=0
} {
i i
h reprezint o secven de funcii de dispersie.
Alegerea lor este o problem destul de complicat. Considernd c h
0
este
una din funciile exa
din secven.
Cutarea poziiei libere
metode de adresare deschis:
cercetarea liniar;
cercetarea ptratic
rerandomizarea.
Cercetarea liniar. te cea mai simpl schem de
adresare deschis, n care ki C h C h
i
+ = ) ( ) (
0
, unde k este o constant. Regula
este simpl, ns exist pericolul unei concentrri a nregistrrilor la
nceputul procesului, unde foarte mult sunt mixate adresele. Pentru a evita
aceasta, k i N trebuie s fie reciproc numere prime, iar k un numr nu prea
mic. Dar n cazul cnd numrul cheilor este mic n raport cu numrul N,
pericolul creterii cii de cutare nu este mare, iar faptul c sinonimele se
vor stoca pe adrese adiacente este un avantaj. n figura 28.13 numrul de
adrese N=10, funcia de dispersie iniial este h
0
(C)=Cmod10+1, iar
h
i
(C)=h (C)+i.
0
C h
0
(C) h
i
(C) Adres nregistr.
25 6 1 80
43 4 2
56 7 3
35 6 8 4 43
54 5 5 54
13 4 9 6 25
80 1 7 56
104 5 10 8 35
9 13
10 104

Figura 28.13 Cercetarea liniar

Cercetarea ptra
numr mare de chei, sinonimele unui grup intr n coliziune cu
alte ch
care
secven
izarea. Rera
tic. Aceasta este schema de adresare deschis, n
care
2
0
) ( ) ( di ki C h C h
i
+ + = , unde k i d sunt constante. Datorit neliniaritii
acestei adresri se poate evita creterea numrului de probe pentru mai
mult de dou sinonime. ns, n cazul unui fiier aproape plin, nu se poate
evita a doua concentrare de chei. Aceasta e condiionat de faptul c, n
cazul unui
ei.
De acest dezavantaj practic este absolvit metoda urmtoare, n
ele de probe pentru astfel de chei se dovedesc a fi diferite.
Rerandom ndomizarea este schema de adresare
deschis n care, )) ( ( ) (
1
C h g C h
i i
= , unde g(C) este o funcie asemntoare cu
h
0
, dar nu echivalent ei. Procesul este repetat pn se gsete o adres
liber. Avantajul acestei metode, n comparaie cu cele anterioare, este de a
evita concentrarea excesiv a nregistrrilor n unele regiuni ale fiierului,
mrind, deci, eficiena operaiilor i accesului. n figura 28.14, este
reprezentat rezultatul aplicrii funciilor de dispersie h
0
(C)=Cmod10+1 i
h
i
(C)=(h (C)+1)mod10+1.
i-1
C h
0
(C) h
1
(C) h
2
(C) h
3
(C) Adres nregistr.
25 6 1 80
43 4 2
56 7 3
35 6 8 4 43
54 5 5 54
13 4 6 8 10 6 25
80 1 7 56
104 5 7 9 8 35
9 104
10 13

Figura 28.14 Rerandomizarea

reze
att mpreun cu directoriul, ct i ntr-un spaiu de memorie separat.
Tratarea prin nlnuire. Tratarea prin nlnuire a coliziunilor
presupune c toate sau o parte de chei sinonime sunt adunate i nlnuite
cu ajutorul pointerilor, formnd o list. Fiecare list se acceseaz prin
adresa produs de funcia de dispersie, figura 28.15. Listele pot fi pst
C h(C) Adres nregistr.
25 6 1 80
43 4 2
56 7 3
35 6 4 43 13
54 5 5 54 104
13 4 6 25 35
80 1 7 56
104 5 8
9
10

Figura 28.15 Tratarea prin nlnuire

etod este
adecv
e prea mare, n loc de liste liniare, pot fi utilizate structuri
arborescente.

n cazul cnd listele de adrese sunt stocate aparte, consultarea lor
este simpl. Dup calcularea valorii funciei de dispersie A=h(C), problema
se reduce la cutarea secvenial a listei cu adresa A (eventual stocat n
memoria secundar). Memoria secundar, n acest caz, poate fi divizat n
blocuri, astfel nct cheile sinonime s se pstreze ntr-un bloc. Deoarece
directoriul va conine numai pointeri, numrul lor poate fi destul de mare
pentru a micora probabilitatea apariiei coliziunilor. Aceast m
at unui numr mare de nregistrri de lungime variabil.
Nu apar probleme la includerea unor chei noi. Dac, ns, numrul de
sinonime devin

Anda mungkin juga menyukai