CATEGORII DOCUMENTE |
In Oracle, spatiul folosit pentru stocarea datelor este controlat prin folosirea structurilor logice de stocare.
O structura logica de stocare este o unitate alocata a spatiului de stocare. Structurile logice dicteaza modul in care va fi utilizat spatiul fizic al bazei de date, configuratia logica a bazei de date avand un impact foarte mare asupra performantei acesteia.
Structurile logice de stocare folosite de Oracle sunt urmatoarele:
Spatii tabel (tablespaces). Spatiul tabel este cea mai mare structura logica de stocare folosita de Oracle. Fiecare obiect al bazei de date este continut intr-un spatiu tabel.
Segmente (segments). Un segment este o multime de extinderi folosite pentru a stoca datele dintr-un obiect al bazei de date, fiind deci omologul fizic al obiectului respectiv.
Extinderi (extents). O extindere este o structura logica de stocare formata dintr-unul sau mai multe blocuri contigue.
Blocuri de date (data blocks). Un bloc este cea mai mica unitate de stocare intr-o baza de date Oracle.
Capitolul de fata prezinta aceste structuri logice de stocare. In plus este prezentat si identificatorul de rand (ROWID), ce reprezinta adresa fizica a unui rand dintr-un tabel in cadrul bazei de date Oracle.
Datele gestionate de SGBDR Oracle sunt impartite in spatii-tabel (tablespaces). Spatiile tabel sunt unitati logice de spatiu pre-alocat ce exista in fisierele de date asociate acestuia. Cu alte cuvinte, datele din baza de date sunt stocate logic in spatii-tabel si fizic in fisiere de date.
Un spatiu tabel este o structura folosita pentru a grupa datele accesate in mod similar. Un spatiu-tabel poate fi constituit din mai multe fisiere de date care pot fi distribuite pe mai multe discuri, deci marimea unui spatiu tabel nu este limitata de marimea unui fisier sau spatiu fizic de stocare. Pe de alta parte, un fisier de date este asociat doar unui spatiu-tabel si unei singure baze de date. Toate obiectele bazei de date (tabele, clustere, indecsi, etc.) trebuie sa aiba specificat un spatiu-tabel unde trebuie sa fie create. Datele care alcatuiesc aceste obiecte sunt apoi stocate in fisierele de date alocate spatiului-tabel respectiv.
Orice baza de date contine un spatiu-tabel numit SYSTEM. Ca parte a procesului de creare a bazei de date, Oracle creeaza automat acest spatiul-tabel. Desi o baza de date relativ mica poate incapea in spatiul-tabel SYSTEM, se recomanda crearea unor spatii-tabel separate pentru datele aplicatiei. Spatiul-tabel SYSTEM este locatia initiala a obiectelor bazei de date. El contine si dictionarul de date, adica informatii despre obiectele bazei de date (tabele, vederi, indecsi, clustere, etc.).
Spatiile-tabel sunt create si administrate de catre DBA (administratorul bazei de date). Fisierele de date vor fi create odata cu crearea sau modificarea (extinderea) unui spatiu tabel, cu exceptia situatiei cand se specifica explicit refolosirea unui fisier de date existent (folosind optiunea REUSE explicata mai jos).
In general, nu trebuie create spatii tabel suplimentare fara un motiv intemeiat, fiind recomandata existenta pe cat posibil a cat mai putine spatii tabel. De asemenea, in cadrul fiecarui spatiu tabel este recomandata crearea a cat mai putine fisiere de date, de dimensiuni cat mai mari. De exemplu, la crearea sau marirea dimensiunii unui spatiu tabel este recomandata crearea unui singur fisier de date de dimensiune mai mare decat a mai multor fisiere de dimensiuni mici.
Marimea unui fisier de date este cea specificata la crearea acestuia si nu reprezinta cantitatea datelor stocate in el. De exemplu, un fisier de date care va fi creat cu marimea de 10 MB, va folosi toti cei 10 MB indiferent daca el contine un milion de randuri sau unul singur. Datorita acestui fapt, dimensiunea unui fisier de date trebuie planificata cu atentie pentru ca, odata creat, un fisier de date nu mai poate fi micsorat. Incepand cu versiunea 7.3 Oracle ofera posibilitatea ca fisierele de date sa se extinda in mod automat (folosind optiunea AUTOEXTEND explicata mai jos) daca spatiul tabel corespunzator devine neincapator pentru datele ce trebuiesc stocate.
Asa cum am vazut pana acum, fisierele bazei de date, spatiile tabel si baza de date sunt notiuni strans legate intre ele. Pentru o mai buna intelegere a acestor notiuni, vom schematiza diferentele cele mai importante dintre acestea:
Baza de date si spatiul tabel |
O baza de date Oracle consta din una sau mai multe spatii tabel. Datele bazei de date sunt stocate colectiv in spatii tabel. |
Spatiul tabel si fisierele de date |
Fiecare spatiu tabel consta din unul sau mai multe fisiere de date. Aceste fisiere de date sunt fisiere fizice ale sistemului de operare pe care ruleaza Oracle. |
Baza de date si fisierele de date |
Datele dintr-o baza de date sunt stocate in fisiere de date ce alcatuiesc spatii tabel. Cea mai simpla baza de date consta dintr-un singur spatiu tabel (SYSTEM, vezi sectiunea 1) si dintr-un singur fisier de date. De exemplu, o baza de date mai complicata poate avea trei spatii tabel fiecare constand din doua fisiere de date, deci in total sase fisiere de date. |
1.1. Crearea spatiilor tabel
Spatiile-tabel pot fi create folosind comanda SQL create tablespace avand sintaxa urmatoare:
CREATE TABLESPACE nume_spatiu_tabel
DATAFILE specificatie_fisier_de_date ,specificatie_fisier_de_date
[MINIMUM EXTENT intreg [K|M]]
[LOGGING | NOLOGGING]
[DEFAULT STORAGE parametrii_de_stocare
[ONLINE | OFFLINE]
[PERMANENT | TEMPORARY]
unde:
DATAFILE specifica fisierul sau fisierele de date pe care le va cuprinde spatiul tabel. Aceste fisiere vor fi create odata cu crearea spatiului tabel. Sintaxa specificatiei unui fisier de date este detaliata mai jos.
MINIMUM EXTENT specifica marimea minima a extinderilor cuprinse in acest spatiu tabel. Aceasta este in bytes (in mod implicit), Kbytes (daca se foloseste optiunea K) sau Mbytes (daca se foloseste optiunea M
LOGGING si respectiv NOLOGGING[1] determina daca la executarea anumitor comenzi SQL (incarcarea de date intr-un tabel, crearea indecsilor, etc.) asupra obiectelor din spatiul tabel se vor pastra sau nu informatii despre aceste operatii in fisierul jurnal pentru recuperare (redo log). Daca nu se specifica nici o optiune, valoarea implicita este LOGGING
default storage specifica valorile implicite (default) pentru parametrii de stocare ale tuturor obiectelor create in spatiul tabel. Parametrii de stocare vor fi detaliati mai jos.
ONLINE activeaza spatiul tabel imediat dupa creare, facandu-l accesibil utilizatorilor care au permisiunea de a accesa spatiul tabel. OFFLINE dezactiveaza spatiul tabel imediat dupa creare, facandu-l inaccesibil. ONLINE este valoarea implicita.
PERMANENT arata ca spatiul tabel va fi folosit pentru a stoca obiecte permanente. TEMPORARY arata ca spatiul tabel va fi folosit doar pentru a stoca obiecte temporare. PERMANENT este valoarea implicita.
Specificatia unui fisier de date, notata mai sus prin specificatie_fisier_de_date are urmatoarea sintaxa:
nume_fisier
SIZE intreg [K|M]]
REUSE]
AUTOEXTEND ]
unde
SIZE specifica marimea fisierului in bytes (in mod implicit), Kbytes (daca se foloseste optiunea K) sau Mbytes (daca se foloseste optiunea M
REUSE determina refolosirea unui fisier de date deja existent. In absenta optiunii REUSE, Oracle va crea un nou fisier de date daca nu exista deja un fisier cu numele mentionat sau va produce un mesaj de eroare in caz contrar. In cazul folosirii optiunii REUSE, Oracle va folosi fisierul daca el exista sau va crea unul nou in caz contrar.
optiunea AUTOEXTEND arata daca fisierul poate creste automat (ON) sau nu (OFF) in cazul in care spatiul tabel are nevoie de mai mult spatiu. Valoarea implicita este OFF. In cazul cand optiunea AUTOEXTEND este ON, se pot specifica atat marimea cresterii fisierului, in bytes Kbytes (K) sau Mbytes (M), prin optiunea NEXT, cat si valoarea maxima a fisierului, care poate fi un numar intreg de bytes Kbytes (K) sau Mbytes (M) sau pate fi nelimitata (UNLIMITED
De exemplu, comanda SQL
create tablespace ts_alfa
datafile '/date/ts_alfa01.dbf'
size 20M;
creeaza spatiul-tabel ts_alfa cu un fisier de date ts_alfa01.dbf de marime 20M. In cazul in care se doreste ca spatiul tabel sa se autoextinda automat cu cate 5M pana la dimensiunea de 50 M se foloseste comanda
create tablespace ts_alfa
datafile '/date/ts_alfa01.dbf'
size 20M
AUTOEXTEND ON NEXT 5M MAXSIZE 50M;
Setarea valorilor implicite ale parametrilor de stocare
In mod ideal, un spatiu tabel ar trebui sa contina numai segmente cu spatii de marimi egale. O modalitate de a realiza acest lucru este de a atribui fiecarui spatiu tabel optiunile dorite de stocare ca optiuni implicite. Clauza default storage a comenzii create table este mijlocul de a face acest lucru. Sintaxa acesteia este urmatoarea:
default storage
[initial intreg [K|M]]
[next intreg [K|M]]
[pctincrease intreg
[minextents intreg
[maxextents intreg
unde:
initial specifica marimea primei extinderi a segmentului. Acesta este in bytes (in mod implicit), Kbytes (daca se foloseste optiunea K) sau Mbytes (daca se foloseste optiunea M). Valoarea implicita este egala cu dimensiunea a 5 blocuri de date.
next specifica marimea celei de-a doua extinderi a segmentului in bytes (in mod implicit), Kbytes sau Mbytes. Valoarea implicita este egala cu dimensiunea a 5 blocuri de date.
pctincrease defineste cresterea, masurata in procente, a fiecarei extinderi ulterioare celei de-a doua. De exemplu, in cazul in care aceasta valoare este 25 (vezi exemplul de mai jos), fiecare extindere incepand cu cea de-a treia va fi cu 25% mai mare decat cea precedenta; deci a treia extindere va avea marimea 40*(1+0.25)K = 50K, a patra extindere va avea marimea 50*(1+0.25) = 62.5K, etc. Valoarea implicita a acestui parametru este 50.
minextents indica numarul de extinderi care vor fi create la crearea obiectului care este stocat in segment.
MAXEXTENTS indica numarul maxim de extinderi pe care Oracle poate sa il aloce pentru obiectul care este depozitat in segment.
Folosirea clauzei implicite de stocare este ilustrata in exemplul urmator:
create tablespace ts_alfa
datafile '/date/ts_alfa01.dbf'
size 20M
default storage
initial 50K
next 40K
pctincrease 25
minextents 5
maxextents 30);
Folosirea clauzei default STORAGE in comanda de mai sus face ca valorile parametrilor de stocare din aceasta clauza sa fie folositi ori de cate ori un obiect al bazei de date (tabel, cluster, instantaneu sau segment de revenire) este creat in spatiul tabel ts_alfa fara a fi setati explicit parametrii de stocare pentru acesta.
1.2. Modificarea spatiilor tabel
Comanda SQL ALTER TABLE poate fi folosita pentru modificarea unui spatiu tabel intr-unul din modurile urmatoare:
Adaugarea de noi fisiere de date
ALTER TABLESPACE ts_alfa
ADD datafile '/date/ts_alfa02.dbf'
size 20M;
Schimbarea numelui unuia sau mai multor fisiere de date atasate tabelului
ALTER TABLESPACE ts_alfa
RENAME datafile '/date/ts_alfa02.dbf' TO '/date/ts_a02.dbf'
Pentru a schimba parametrii impliciti de stocare:
alter tablespace ts_alfa
default storage
initial 50K
next 50K
pctincrease 25
minextents 5
maxextents 30);
Pentru a activa (ONLINE) sau dezactiva (OFFLINE) tabelul:
alter tablespace ts_alfa
OFFLINE
Pentru a arata ca un back-up va fi efectuat asupra fisierelor de date cuprinse in spatiul tabel (BEGIN BACKUP) sau ca un back-up al tabelului a luat sfarsit (END BACKUP
alter tablespace ts_alfa
START BACKUP
1.3. Distrugerea spatiilor tabel
Un tabel poate fi distrus folosind comanda SQL DROP TABLE. Pentru a distruge un spatiu tabel care contine obiecte ale bazei de date, este necesara folosirea optiunii INCLUDING CONTENTS
DROP TABLESPACE ts_alfa INCLUDING CONTENTS;
Spatiul tabel SYSTEM nu poate fi sters datorita faptului ca acesta contine dictionarul de date. O alta restrictie care se impune de catre Oracle este aceea ca spatiul tabel SYSTEM nu poate fi OFFLINE
In concluzie, spatiile tabel sunt folosite pentru a separa accesul (citire/scriere) la date diferite din baza de date. De exemplu, prin folosirea spatiilor tabel multiple se pot obtine urmatoarele avantaje:
Separarea datelor de sistem fata de cele ale aplicatiei prin stocarea acestora din urma in alt spatiu tabel decat SYSTEM
Separarea aplicatiilor intre ele prin stocarea datelor pe doua spatii tabel diferite;
Restrangerea accesului la anumite date prin dezactivarea spatiului tabel in care sunt stocate aceste date;
Posibilitatea de a stoca spatii tabel diferite pe unitati de disc distincte in vederea imbunatatirii performantelor si reducerii conflictelor de acces la date. De exemplu, un spatiu-tabel poate fi creat pentru a stoca date, iar altul pentru a stoca indecsi. Daca acestor doua spatii-tabel le sunt alocate fisiere de date care sunt plasate pe doua discuri distincte, atunci se asigura faptul ca accesul la indecsi nu interfereaza cu accesul la datele pentru care sunt creati indecsii.
Un spatiu tabel poseda unul sau mai multe segmente. Un segment este o multime de extinderi folosite pentru a stoca datele dintr-un obiect al bazei de date. Deci se poate spune ca segmentele sunt omoloagele fizice ale obiectelor bazei de date care stocheaza date, adica fiecarui obiect stocat fizic ii corespunde un segment. Asa cum vom vedea in capitolul 6, nu toate obiectele unei baze de date sunt stocate fizic, deci exista obiecte carora nu le corespunde un segment. Un segment utilizeaza un numar de blocuri care se gasesc in acelasi spatiu tabel (desi blocurile se pot gasi in fisiere de date diferite).
Baza de date Oracle foloseste patru tipuri de segmente:
Acestea se mai numesc si segmente tabel (table segment) si stocheaza datele din tabelele, clusterele si instantaneele bazei de date. Un astfel de tip de segment este creat in mod indirect prin intermediul comenzilor SQL create table create cluster sau create snapshot
Valorile parametrilor de stocare (INITIAL NEXT PCTINCREASE MINEXTENTS MAXEXTENTS, vezi sectiunea 1.1) pot fi setate folosind clauza storage a acestor comenzi (vezi primul exemplu de mai jos); in caz contrar (vezi al doilea exemplu de mai jos), sunt folosite valorile implicite pentru spatiul tabel pe care este creat tabelul, indexul sau instantaneul respectiv.
Exemplul 1:
create table persoana(
cod_persoana number(10),
nume varchar2(10),
prenume varchar2(10),
data_nastere date)
tablespace ts_alfa
storage
initial 50K
next 50K
pctincrease 0
minextents 10
maxextents 40);
Exemplul 2:
create table persoana(
cod_persoana number(10),
nume varchar2(10),
prenume varchar2(10),
data_nastere date)
tablespace ts_alfa;
Acest tip de segment pastreaza datele unui index al bazei de date. Un segment de indecsi este creat indirect prin intermediul comenzii SQL create index. La fel ca si in cazul segmentelor de date, valorile parametrilor de stocare pot fi setate folosind clauza storage sau pot fi folosite valorile implicite ale spatiului tabel pe care este creat indexul.
2.3. Segmente de revenire (rollback segments)
Un segment de revenire este o portiune a bazei de date care inregistreaza actiunile unei tranzactii SQL in vederea derularii inapoi, daca se doreste acest lucru. Un segment de revenire restabileste baza de date in starea in care se gasea la ultimul punct de salvare sau la ultima actualizare permanenta (commit
Fiecare tranzactie are un segment de revenire asociat. De obicei, acest segment este atribuit automat de catre baza de date. Exista totusi posibilitatea de a asocia o tranzactie cu un anumit segment de revenire, folosind comanda SQL set transaction cu optiunea use rollback segment. Un segment de revenire poate fi folosit concurent de una sau mai multe tranzactii.
Segmentele de revenire pot fi create folosind comanda SQL create rollback segment, in care se poate specifica spatiul tabel pe care se creeaza segmentul. Daca aceasta optiune este omisa, segmentul de revenire este creat implicit in segmentul tabel SYSTEM. De asemenea, se pot specifica si parametrii de stocare folosind clauza STORAGE sau pot fi folositi cei impliciti ai spatiului tabel. Alaturi de parametrii de stocare mentionati mai sus (INITIAL NEXT PCTINCREASE MINEXTENTS MAXEXTENTS), in cazul segmentelor de revenire poate fi folosit si parametrul optimal, a carui valoare (in bytes, Kbytes sau Mbytes) specifica marimea optima a segmentului de revenire (vezi exemplul de mai jos). Oracle incearca sa mentina aceasta marime pentru segmentul de revenire prin dealocarea dinamica a extinderilor atunci cand datele pe care le contin nu mai sunt necesare. Oracle va dealoca cate extinderi este posibil fara a reduce marimea totala a segmentului de revenire sub valoarea optima.
create rollback segment rb1
tablespace ts_rbs
default storage
initial 250K
next 250K
pctincrease 0
minextents 16
optimal 4M
);
Un segment temporar este creat atunci cand o comanda SQL necesita un spatiu de lucru temporar. De exemplu, pentru o operatie de sortare (clauza order by dintr-o comanda select) va fi creat un segment temporar reprezentand zona de lucru pentru aceasta operatie. Segmentele temporare sunt distruse atunci cand comanda SQL respectiva este terminata.
Fiecare segment este compus din una sau mai multe extinderi; la randul lor, o extindere este formata dintr-unul sau mai multe blocuri contigue. Cu alte cuvinte, orice segment este compus din mai multe grupuri de blocuri contigue, adica dintr-o zona de memorie contigua. Atunci cand un segment epuizeaza spatiul de stocare care i-a fost alocat, Oracle ii acorda o noua extindere. La momentul crearii, fiecare segment poseda cel putin o extindere. Asa cum am vazut, numarul de extinderi precum si dimensiunea acestora pot fi specificate folosind clauza storage a comenzii de creare a obiectului respectiv sau pot fi specificate ca valori implicite folosind clauza default storage la crearea spatiului tabel.
Pentru a putea intelege mai bine modul de functionare al extinderilor vom ilustra in continuare modul de gestiune al acestora in momentul crearii si inserarii inregistrarilor intr-un tabel. Daca un tabel este creat folosind setarile implicite (vezi exemplul 2 din sectiunea 2), Oracle aloca 5 blocuri pentru prima extindere (cunoscuta si ca extinderea initiala). Cele 5 blocuri se umplu cu date pe masura ce inregistrarile sunt inserate in tabel. Cand ultimul bloc a fost umplut si se doreste inserarea unei noi inregistrari, baza de date aloca automat un alt set de 5 blocuri. Aceasta alocare continua pana cand nu mai exista loc in spatiul tabel. Singura restrictie care se impune este aceea ca blocurile unei extinderi trebuie sa se gaseasca in acelasi fisier de date. (Aceasta restrictie este o consecinta logica a faptului ca blocurile trebuie sa se gaseasca intr-o zona de memorie contigua).
La alocarea unei noi extinderi pentru un segment, Oracle parcurge spatiul tabel corespunzator in cautarea primului set contiguu de blocuri care au impreuna dimensiunea incrementului stabilit pentru o extindere. In momentul in care o extindere a fost alocata unui segment, blocurile continute in aceasta nu mai pot fi utilizate de catre alt obiect al bazei de date chiar daca, de exemplu, randurile dintr-un tabel au fost sterse. Totusi, extinderile segmentelor pot fi dealocate atunci cand nu mai sunt necesare. In general, extinderile nu sunt returnate spatiului-tabel ca spatiu liber pana cand nu este returnat intreg segmentul. Acest lucru survine, de exemplu, atunci cand un tabel este distrus, iar segmentul si extinderile sale sunt eliberate. Exceptie fac segmentele de revenire care elibereaza spatiul alocat in mod dinamic.
Blocul de date reprezinta cea mai mica unitate de stocare utilizata de Oracle pentru stocarea datelor. Un bloc de date corespunde unui bloc fizic de octeti de pe disc. In interiorul fisierelor de date spatiul de stocare este compus din blocuri de date. Marimea unui bloc de date corespunde cu numarul de octeti cititi sau scrisi de SGBDR Oracle intr-o singura operatie I/O (intrare/iesire, citire/scriere). Marimea unui bloc de date poate fi setata folosind parametrul DB_BLOCK_SIZE din fisierul de initializare a parametrilor; pentru Windows NT, valoarea implicita (default) a marimii unui bloc este de 2 KB. De exemplu, presupunand ca marimea unui bloc este de 2 KB, pentru o baza de date de 50 MB (51200 KB) vor exista 25600 de blocuri.
Dimensiunea blocului este un factor important al eficientei bazei de date deoarece ea determina numarul de octeti cititi din fisierele de date intr-o singura operatie I/O. Daca blocul este prea mare, sunt aduse inregistrari inutile pentru a satisface cererea curenta, ceea ce duce la cresterea timpului necesar regasirii datelor. Daca dimensiunea blocului este prea mica, sunt necesare operatii suplimentare de I/O pentru a satisface cererea. Daca in mod obisnuit aplicatia citeste si scrie cantitati mici de date la fiecare tranzactie, atunci blocurile de dimensiune mai mici sunt mai eficiente din punct de vedere al performantei operatiei I/O. Daca, din contra, aplicatia proceseaza o cantitate mare de date intr-o singura tranzactie, atunci blocurile mai mari sunt mai eficiente.
Fiecare bloc este numerotat secvential pentru fiecare fisier de date incepand cu 1. Doua blocuri pot avea aceeasi adresa numai daca se gasesc in fisiere de date diferite. Orice bloc de date contine spatiu pentru informatii antet (header information), pentru modificari viitoare de date in blocul respectiv si pentru randurile stocate efectiv in bloc. Antetul blocului contine informatii precum segmentele bazei de date care au randuri in blocul respectiv, cate tranzactii pot accesa simultan blocul, etc. Fiecare bloc aloca un anumit spatiu pentru modificari viitoare ale randurilor stocate in bloc. Daca o astfel de modificare duce la cresterea randului original, atunci este folosit acest spatiu.
La crearea unei baze de date, se utilizeaza cateva blocuri din primul fisier de date, restul ramanand libere. Oracle gestioneaza o lista cu blocurile ramase libere din fiecare fisier de date aferent unui spatiu tabel cu ajutorul dictionarului de date.
Pentru controlul utilizarii spatiului liber al blocurilor de date din extinderile unui segment, proiectantul aplicatiei are la dispozitie doi parametri, pctfree si pctused. Ambii parametri pot fi specificati numai in momentul crearii sau modificarii tabelelor si clusterelor, in cadrul comenzilor SQL create table si create cluster. In plus, parametrul PCTFREE poate fi setat si la crearea indecsilor, in cadrul comenzii CREATE INDEX. De exemplu:
create table persoana(
cod_persoana number(10),
nume varchar2(10),
prenume varchar2(10),
data_nastere date)
pctfree
pctused 70
unde
PCTFREE reprezinta spatiul in procente din fiecare bloc de date rezervat pentru o posibila expansiune cauzata de actualizarile viitoare. Valoarea trebuie sa fie un intreg intre 0 si 99, valoarea implicita fiind 10. In exemplul de mai sus 20% din fiecare bloc este rezervat pentru modificarea randurilor existente si permite inserarea noilor inregistrari in 80% din spatiul fiecarui bloc.
PCTUSED reprezinta procentul de umplere a blocurilor unei extinderi pana la realizarea careia Oracle continua sa insereze noile inregistrari in extinderea curenta. In exemplul de mai sus, in momentul in care continuarea inserarii de noi randuri ar duce la depasirea procentajului de 70%, inserarea este oprita, se aloca o noua extindere si se continua inserarea noilor randuri in noua extindere.
Suma dintre PCTFREE si PCTUSED nu trebuie sa depaseasca 100. O valoare mare a parametrului PCTUSED reduce spatiul de stocare neutilizat, insa reduce viteza de executie a instructiunilor insert (inserare) si update (actualizare). O valoare mica a acestui parametru duce la cresterea spatiului de stocare neutilizat si imbunatateste eficienta procesarii anumitor comenzi SQL.
5 Identificatorul de rand (ROWID)
Identificatorul de rand ROWID) este o adresa fizica unica pentru fiecare rand al unui tabel. Datorita acestui fapt, identificatorul de rand poate fi privit ca pe o pseudo-coloana a tabelului. Aceasta pseudo-coloana are denumirea ROWID si poate fi folosita in interogari. Identificatorul de rand este creat in mod automat de catre Oracle in momentul in care un rand este inserat permanent intr-un tabel. Valoarea identificatorului va ramane neschimbata pana cand randul aferent sau tabelul ce contine acest rand va fi sters, prin urmare valorile pseudo-coloanei ROWID nu pot fi modificate.
In versiunea Oracle7 un identificator de rand era alcatuit din trei componente necesare pentru localizarea unei inregistrari:
Numarul blocului ce contine inregistrarea. Numerele blocurilor sunt relative la fisierul de date aferent si nu la spatiul tabel. Prin urmare, putem avea doi identificatori de rand ce au acelasi numar de bloc dar au fisiere de date diferite aflate in acelasi spatiu tabel.
Numarul randului din bloc ce contine inregistrarea. Numerele randurilor dintr-un bloc dat incep intotdeauna cu 0.
Numarul fisierului de date ce contine inregistrarea. Numarul primului fisier dintr-o baza de date este 1. In versiunea Oracle7, numerele fisierelor sunt unice in cadrul unei baze de date
In acest caz, identificatorul unui rand are formatul:
bloc.rand.fisier
Pentru a exemplifica formatul identificatorului de rand putem folosi urmatoarea interogare:
SELECT ROWID, SUBSTR(ROWID,15,4) 'FISIER',
SUBSTR(ROWID,1,8) 'BLOC',
SUBSTR(ROWID,10,4) 'RAND'
FROM produse;
Interogarea de mai sus va avea un rezultat de forma:
ROWID FISIER BLOC RAND
------ -------- ----
00000DD5.0000.0001 0001 00000DD5 0000
00000DD5.0001.0001 0001 00000DD5 0001
00000DD5.0002.0001 0001 00000DD5 0002
In versiunea Oracle7 se putea folosi formatul de mai sus pentru identificatorul de rand deoarece numerele fisierelor de date erau unice in cadrul unei baze de date. Versiunea Oracle8 inlatura aceasta restrictie, numarul unui fisier trebuind sa fie unic doar in cadrul unui spatiu tabel (acesta va fi numit numarul fisierului relativ la spatiul tabel). In consecinta, pentru identificarea unica a unui rand se foloseste o a patra componenta, numarul de identificare al obiectului, care determina in mod unic segmentul bazei de date in care se afla obiectul obiectele din acelasi segment de exemplu tabelele dintr un cluster) au acelasi numar de obiect. Deci in Oracle8 se foloseste o versiune extinsa a ROWID, alcatuita din urmatoarele patru componente:
numar obiect
numar relativ al fisierului de date
numar bloc
numar rand din bloc
In acest caz, identificatorul unui rand necesita 18 caractere pentru afisare. Prin urmare, identificatorul de rand are formatul:
OOOOOO |
FFF |
BBBBBB |
RRR |
|||
Numar obiect |
Numar relativ al fisierului de date |
Numarul blocului |
Numarul randului |
Identificatorul de rand are mai multe utilizari importante. El reprezinta in primul rand cel mai rapid mod de a localiza o anumita inregistrare. Prin urmare el este utilizat intern de catre indecsi (vezi sectiunea 6.3) sau poate fi utilizat de catre dezvoltatorii de aplicatii atunci cand se cunoaste valoarea sa. Identificatorul de rand poate fi utilizat si pentru a culege informatii referitoare la stocarea fizica a datelor din tabele. De exemplu, daca ne intereseaza localizarea fizica a randurilor unui anumit tabel, adica in cate fisiere de date sunt continute inregistrarile tabelului, vom folosi o interogare de forma:
SELECT COUNT(DISTINCT(SUBSTR(ROWID,15,4))) 'FISIERE'
FROM produse;
Optiunea NOLOGGING este o noutate adusa de versiunea Oracle8 si poate fi folosita pentru a mari performanta instructiunilor SQL in cazul bazelor de date mari. De exemplu, incarcarea intr-un tabel a milioane de inregistrari in modul implicit LOGGING ar duce la inscrierea unei mari cantitati de informatii in fisierele jurnal, consumand astfel spatiu fizic pe disc si incetinind vizibil procesul.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1138
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved