ORACLE - scurtă trecere
în revistă

      Încă din cele mai vechi timpuri oamenii au avut nevoie de informaţii. O dată cu informaţia a apărut şi necesitatea schimbului de informaţii. Pentru aceasta era nevoie de un suport material care să stocheze informaţia şi să o transmită mai departe. S-a început cu cioplirea informaţiilor în piatră şi s-a continuat cu alte şi alte soluţii până în zilele noastre, când asistăm la decăderea unui suport (hârtia) şi ridicarea altuia (suportul electro-magnetic).
      O dată cu evoluţia omenirii, informaţia a crescut ca dimensiune. Se pune deci problema, nu numai a stocării datelor, ci şi a stocării unei mari cantităţi de date. De asemenea, o altă problemă este regăsirea informaţiei şi cu ea rapiditatea obţinerii rezultatului. În epoca actuală (a suportului magnetic) o solutie a problemelor enumerate anterior o dă firma Oracle, cu produsul său ajuns la versiunea 9i.
      Nu vom enumera acum toate problemele pe care vrea să le rezolve un SGBD (Sistem de Gestionare a Bazelor de Date) ci vom încerca să intrăm puţin în "bucătăria internă" a soluţiei oferite de firma Oracle. Vom vedea în continuare cum stochează datele un server Oracle. Nu ne vom ocupa în acest articol de partea de client, de interogare a bazei de date.
      Un server Oracle se compune, în principal, dintr-o bază de date şi o instanţă a serverului Oracle.
      O bază de date Oracle are atât o structură fizică cât şi o structură logică. Cele două tipuri de structuri sunt proiectate şi implementate astfel încât structura fizică (practic, sistemul de stocare fizică a datelor pe hard disk) poate fi "administrată" fără a afecta structura logică de stocare. Această "administrare" implică o multitudine de activităţi făcute în scopul de a optimiza interogările asupra bazei de date.
      Structura fizică a bazei de date este determinată de fişierele sistemului de operare pe care este instalată. Se disting trei tipuri de fişiere:

  • unul sau mai multe fişiere de date,
  • două sau mai multe fişiere "redo log" (vom vedea mai târziu rolul lor),
  • unul sau mai multe fişiere de control.
      Structura logică a bazei de date este compusă din:
  • unul sau mai multe spaţii tabelă (tablespace),
  • o "colecţie de obiecte" a bazei de date (schema object). Este formată din tabele, vederi, secvenţe, proceduri, sinonime, indecşi, clustere şi legături.
      O instanţă este compusă din două tipuri de procese:
  • procese utilizator - execută un cod (interogare) "trimis" de o aplicatie cum ar fi o formă Oracle sau aplicaţie Visual C++ - prin ODBC.
  • procese Oracle - conlucrează pentru optimizarea vitezei de răspuns şi asigurarea siguranţei şi securităţii bazei de date.

      De fiecare dată când o bază de date este "start-ată" (proces care poate fi făcut automat, la încărcarea sistemului de fişiere sau ulterior, prin executarea, manuală, a unor programe) se alocă un SGA (System Global Area) şi se porneşte în background o sumă de procese. SGA este un segment (buffer) de memorie, utilizată pentru datele din baza de date şi care este împărţită de utilizatori.
      Sistemul compus din buffer-ul de memorie şi procesele din background se numeşte instanţă Oracle.
      Să vorbim în continuare, mai pe larg, despre structura fizică a bazei de date.
      O bază de date Oracle este compusă din unul sau mai multe fişiere de date, care conţin toate tabelele şi indecşii structurii logice. Un fişier de date are, în principal, trei caracteristici:

  • poate aparţine unei singure baze de date,
  • trebuie să aibă posibilitatea de "extindere" automată a spaţiului pe hard disk, în cazul în care baza de date devine din ce în ce mai mare,
  • unul sau mai multe fişiere de date pot forma o unutate logică denumită tablespace (spaţiu tabelă).

      Al doilea tip de fişiere, care compun structura fizică a unei baze de date, sunt fişierele "redo log". Principala lor funcţionalitate este de a înregistra modificările ce urmează a fi efectuate asupra datelor. Aceste fişiere sunt necesare în cazul unei întreruperi a procesului de scriere definitivă a datelor pe discul hard. De exemplu presupunem că avem o bază de date a unei firme. La un moment dat trebuie să mărim salariul de bază al fiecărui angajat cu un anumit coeficient. Să presupunem că acest coeficient este identic pentru toţi salariaţii. Comanda SQL este:

UPDATE salarii SET salar_baza = c*salar_baza; unde:
  • "salarii" - tabela care conţine salariul de bază,
  • "c" - coeficientul de mărire,
  • "salar_baza" - câmpul din tabela "salarii" ce conţine valoarea salariului de bază.

      Ce se întâmplă în momentul executării acestei instrucţiuni? Se începe cu primul salariat. Se înmulţeşte salariul lui, de bază, cu coeficientul "c" şi apoi se face o scriere pe hard disk. Se ia următorul salariat, ……. şi aşa mai departe până la ultima înregistrare din tabela "salarii". Acest proces poate dura de la câteva fracţiuni de secundă până la câteva secunde (funcţie de mărimea tabelei "salarii" şi de performanţele de viteză ale discului hard). Dacă în timpul procesului se întrerupe curentul (presupunem că serverul nu este legat la un UPS), ce se întâmplă? Unii angajaţi vor avea salariul indexat iar alţii nu. Aici intervin fişierele de "redo log". Cu ajutorul lor se poate reface tabela iniţială (fără înmulţirea respectivă) şi ulterior se poate aplica din nou procedura de UPDATE.
      Un alt tip de fişiere sunt cele de control. Ele conţin informaţii despre structura fizică a bazei de date: numele bazei de date; numele şi localizarea pe hard disk a fişierelor de date şi a fişierelor de "redo log"; data creării bazei de date.
      De fiecare dată când se porneşte o instanţă a bazei de date Oracle, fişierele de control sunt utilizate pentru a identifica fişierele de date şi de "redo log" ce trebuie deschise. Atunci când se produc modificări ale structurii fizice a bazei de date (se creează un nou fişier de date) trebuie modificate automat şi fişierele de control.
      Oracle stochează datele, din punct de vedere al structurii logice, în spaţii tabelă (tablespace). Să vedem, mai exact, care este legătura dintre baza de date, spaţii tabelă şi fişiere de date:

  • o bază de date constă din una sau mai multe spaţii tabelă,
  • fiecare spaţiu tabelă este compus din unul sau mai multe fişiere de date,
  • datele propriu-zise sunt stocate în tabele. Un tabel este conţinut într-un spaţiu tabelă. Dacă acel spaţiu tabelă este compus din mai multe fişiere de date, tabela respectivă poate fi "distribuită" în două fişiere de date.

Blocuri de date, extensii, segmente

      Unităţile logice de stocare a datelor sunt compuse din trei elemente: blocuri de date, extensii şi segmente. "Cărămida" de bază a stocării datelor sunt blocurile de date. Extensiile sunt formate dintr-un număr mai mare sau mai mic de blocuri de date, iar un segment este format din una sau mai multe extensii. Blocurile de date ce intră în componenţa unei extensii trebuie să facă parte dintr-o porţiune continuă de memorie pe disc.
      Deoarece extensiile sunt alocate atunci când este nevoie, un segment poate fi compus din extensii ce nu alcătuiesc o porţiune continuă de memorie pe discul hard.
      O bază de date Oracle poate utiliza patru tipuri de segmente:

  • segmente de date. Se crează atunci când este folosită comanda CREATE TABLE,
  • segmente index. Orice index este compus dintr-un singur segment, alocat odată cu utilizarea comenzii CREATE INDEX,
  • segmente temporare. Sunt utilizate de baza de date Oracle atunci când se execută interogări SQL, fiind necesară o ordonare (sortare) a rezultatelor. Acest tip de segmente sunt alocate şi dealocate în mod automat şi foarte frecvent. Din acest motiv se recomandă crearea unui spaţiu tabelă special.
  • segmente de rollback. Orice bază de date Oracle conţine unul sau mai multe astfel de segmente. Ele înregistrează vechile valori ale datelor ce au fost modificate de tranzacţii.
      Sintaxa de bază pentru ceearea unei tabele este: CREATE TABLE [nume_schema.] nume_tabel ([coloan&#259 tip_dat&#259 [NOT NULL] ] ) [TABLESPACE nume_spa&#355iu_tabel&#259 | PCTFREE integer | PCTUSED integer | INITRANS integer | MAXTRANS integer | STORAGE ( INITIAL integer [ K | M ] | NEXT integer [ K | M ] | PCTINCREASE integer | MINEXTENTS integer | MAXEXTENTS integer ) ] Pentru definirea tabelei "salarii", de mai sus, se foloseşte sintaxa: CREATE TABLE salarii (marca NUMBER(4) NOT NULL, salar_baza NUMBER NUT NULL, observa&#355ii VARCHAR(40)) TABLESPACE economic PCTFREE 10, PCTUSED 80 STORAGE (INITIAL 10K NEXT 4K PCTINCREASE 50 MINEXTENTS 1 MAXEXTENTS 10)
      Tabela va avea trei câmpuri:
  • marca - de tip numeric, format din maxim patru caractere (poate lua valori între 0 şi 9999),
  • salar_baza - de tip numeric, format din oricâte cifre,
  • observaţii - de tip caracter, cu maxim 40 caractere.

      Observăm că primele două câmpuri au specificaţia NOT NULL. Asta înseamnă că la inserarea unei noi înregistrări în tabelă, cele 2 câmpuri trebuie să aibă obligatoriu o valoare (poate fi şi zero). Dacă unul din câmpuri nu este completat, serverul Oracle, returnează o eroare şi nu va face înserarea. Al treilea câmp, observaţii, nu are specificaţia NOT NULL, deci valoarea lui poate să lipsească în cazul unei înserări.
      Tabela va fi cuprinsă în spaţiul tabelă denumit "economic". Clauza de stocare INITIAL specifică spaţiul alocat iniţial, la crearea tabelei (în cazul nostru 10 KB). Acest spaţiu reprezintă extensia iniţială. După umplerea lui cu date, Oracle, va crea o extensie suplimentară de 4 KB, după cum este specificat în clauza NEXT. Dacă şi acest spaţiu se umple cu date, va fi creată o altă extensie, cu 50% mai mare, după cum este specificat prin opţiunea PCTINCREASE. În cazul nostru vor fi alocaţi 4 KB * 1,5 = 6 KB.
      Numărul maxim de extensii, pe care le poate aloca Oracle pentru o tabelă, este dat de opţiunea MAXEXTENTS - în cazul nostru 10.

Formatul unui bloc de date

      Mărimea blocului de date este specificat la crearea bazei de date, fiind compus din cinci zone:

  1. Header - conţine informaţii generale cum ar fi: adresa fizică a blocului şi tipul segmentului din care face parte (de date, index sau rollback),
  2. Director de tabelă - conţine informaţii despre tabelele care au înregistrări în acest bloc,
  3. Director de înregistrare - conţine informaţii despre înregistrările actuale din bloc: adresa fizică a fiecărei înregistrări. Toate cele trei componente, descrise până acum, au o lungime medie de aproximativ 84-107 bytes, pentru fiecare bloc de date,
  4. Datele propriuzise,
  5. Spaţiu liber - este utilizat pentru inserarea noilor înregistrări sau pentru modificarea unor câmpuri din înregistrările curente (un câmp este NULL şi este modificat, atribuindu-i o valoare). Mărimea spaţiului liber este dată de valorile opţiunilor PCTFREE şi PCTUSED.

      Parametrul PCTFREE setează procentul minim al spaţiului unui bloc de date care va fi rezervat pentru posibilele modificări (UPDATE) ale înregistrărilor deja existente în acel bloc. În exemplul ales acest parametru are valoarea 10%. Asta înseamnă că se permit înserări în acest bloc până când spaţiul liber este mai mic sau egal cu 10% din dimensiunea blocului. Din acest moment, următoarea înregistrare (INSERT) se va face în blocul de date următor.
      Presupunem că un bloc este utilizat peste 90% (100 - PCTFREE) şi din el se fac anumite ştergeri (DELETE). Oracle va semnala că există spaţiu liber în interiorul blocului, pentru adaugare de noi înregistrări, numai când blocul va fi utilizat mai puţin de 80% (PCTUSED). Dacă, de exemplu, în urma unei ştergeri, un bloc este utilizat în proporţie de 85% şi urmează o inserare, Oracle nu va completa acest bloc.
      La crearea unei tabele trebuie mare atenţie cum se vor seta aceşti parametri: funcţie de lungimea înregistrărilor; de numărul total de înregistrări; etc. Alegerea lor are mare importanţă asupra performanţelor de viteză ale bazei de date.