Home » Approfondimenti » Computer Science » Oracle Database
  []

Oracle è un DBMS (database management system) ed è tipicamente composto dai seguenti elementi:

  • kernel code (codice che gestisce l’organizzazione e l’immagazzinamento dei dati);
  • repository dei metadati (normalmente chiamato data dictionary);
  • query language;

di tipo relazionale (RDBMS), che implementa cioè il modello relazionale:

  • struttura (oggetti predefiniti ospitano e accedono ai dati);
    • fisica 
      • data files (ogni database Oracle ha 1 o più file che contiene i dati immagazzinati nel DB);
      • control files (ogni database Oracle ha 1 file di controllo che contiene i metadati che specificano la struttura fisica del DB, ad esempio il nome e la posizione dei data files);
      • log files (ogni database Oracle ha 1 online redo log che contiene una copia delle modifiche apportate ai dati. Sono usati per il ripristino del DB dopo un problema hardware, software o di rete);
    • logica
      • data blocks (una data block corrisponde ad un determinato numero di byte ed è il più basse livello di granularità nel quale sono immagazzinati i dati);
      • extents (uno specifico insieme di blocchi logicamente contigui, ottenuto in una singola allocazione);
      • segments (un insieme di extent, allogati per uno schema object, undo data o dati temporanei);
      • tablespaces (ognuna delle unità logiche in cui è divisa la struttura logica del DB. E’ il contenitore logico di un segment. Ogni tablespace è legato ad almeno un data file fisico);
      • la struttura fisica e logica sono indipendenti;
  • operazioni (azione ben definiti permettono alle applicazioni di manipolare la struttura e i dati);
    • logiche (si specifica quale contenuto è richiesto);
    • fisiche (si determina come ottenere il contenuto richiesto);
  • regole di integrità (regole di integrità governato le operazioni sulla struttura e i dati);

Un database relazionale è un database che ospita i dati in un insieme di semplici ‘relazioni‘. Una relazione è un insieme di ‘tuple‘. Una tupla è un insieme non ordinato di attributi. Una tabella è la rappresentazione bi-dimensionale di una relazione nella forma di righe (tuple) e colonne (attributi). Uno schema (database schema) è un insieme di strutture logiche (schema objects, tra cui tabelle e indici) e generalmente ha lo stesso nome dello user che ne è l’owner. Alcuni database objects (ruoli e profili) non risiedono negli schema.

Istanza

Quando un’applicazione si connette a un database Oracle, si connette ad un’istanza del database. L’istanza serve l’applicazione allocando altre aree di memoria nella SGA (System Global Area) e facendo partire altri processi tra i processi di background.  Ogni processo di background o processo server ha una parte esclusiva di memoria che contiene dati e informazioni di controllo chiamata PGA (Program global area).

Oracle Net Listener

E’ un processo eseguito sul server o nella rete (che unisce applicazione client e il server con l’istanza di Oracle) che riceve le richieste di connessione dal client e gestisce il traffico di queste richieste verso il server. Quando la connessione è stabilita, client e server dialogano direttamente. E’ possibile lavorare con processi in modalità dedicated server or shared server, in quest’ultimo caso cìè un dispatcher che permette a molte applicazioni client di connettersi alla stessa istanza senza il bisogno di un servizio server dedicato. 

SqlPlus

Per accedere ad un’istanza remota di Oracle è necessario settare i transname.ora

local_SID =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL= TCP)(Host= hostname.network)(Port= 1521))
    (CONNECT_DATA = (SID = remote_SID))
  )

e digitare nel command prompt di windows

sqlplus user/pass@local_SID

Schema

E’ una collezione logica di database objects:

  • tabelle (immagazzinano i dati in righe);
  • indici (contengono una entry per ogni riga indicizzata);
  • partizioni (parti di una tabella o indice molto grande);
  • viste (rappresentazioni customizzate di una o più tabelle o viste. Non contengono dati);
  • sequence (può essere condiviso da più utenti per generare un intero. Generalmente usato per generare primary key);
  • dimensioni  (definisce una relazione padre-figlio tra coppie di insiemi di colonne, dove tutte le colonne di un insieme devono venire dalla stessa tabella);
  • sinonimi (alias per un’altro database object);
  • packages (una pl/sql package raggruppa logicamente pl/sql tipi, ps/sql variabili e pl/sql sottoprogrammi che sono named pl/sql blocks cioè storedprocedure); 

e ha lo stesso nome dello user che lo gestisce. Ci sono alcuni database object che non sono parte di uno schema:

  • user account;
  • ruoli;
  • dictionary;
  • context;

La maggior parte degli oggetti di uno schema è memorizzata in strutture logiche di memoria chiamate segmenti e in raggruppamenti di questi, chiamati tablespace. Un tablespace può contenere oggetti di più schemas e gli oggetti di uno schema possono essere contenuti in più tablespace.  I dati di ogni database object può essere contenuto in uno o più file fisici.  Mentre esistono alcuni database object che non contegono dati ma solo metadati (viste, sequence).

Sys e System

L’account amministrativo Sys è creato automaticamente alla creazione del database. L’utente Sys ha i diritti per eseguire tutte le attività di amministrazione sul db. Lo schema Sys contiene tutte le tabelle e le viste del data dictionary.  Queste tabelle non devono essere manipolate dagli utenti.

L’account amministrativo System è creato automaticamente alla creazione del database. Lo schema System ha ulteriori tabelle e viste che mostrano informazioni di tipo amministrativo e tabelle ad uso interno di tool e opzioni del database. 

Tabella

Una tabella è un’unità di base nell’organizzazione dei dati di un db. Spesso corrisponde ad un’entità.

  • tabelle relazionali;
    • heap-organized (default option): immagazzina le righe senza nessun ordine particolare;
    • index-organized: immagazzina le righe secondo la chiave primaria;
    • external table: è una tabelle di sola lettura, i cui metadati sono memorizzati nel database ma i cui dati sono immagazzinati esternamente al database;
  • tabelle di oggetti (ad esempio una tabella di un tipo a sua volta creato dall’utente);
    • CREATE or REPLACE TYPE department_type AS OJBECT (name varchar(20));
    • CREATE or REPLACE TABLE department_type_table AS department_type;
    • CREATE or REPLACE TYPE   department_table_type AS TABLE OF department_type;

Indici

Lo scopo principale di avere un indice è accelerare le query di ricerca riducendo essenzialmente il numero di record/righe in una tabella che devono essere esaminati. Un indice è una struttura di dati (più comunemente un albero B) che memorizza i valori per una colonna specifica in una tabella.

Dato un valore che è stato indicizzato, l’indice punta direttamente alle righe contenenti quel valore. In una tabella heap-organized che non abbia indici è necessario eseguire un full table scan per recuperare un valore. Predisporre un indice nei seguenti casi:

  • le colonne indicizzate sono interrogate frequentemente e ritornano una piccola percentuale delle righe totali;
  • le colonne indicizzate sono delle chiavi esterne
  • quando si pensa di inserire una chiave unica e si vuole specificare manualmente l’indice e le sue opzioni;
  • gli indici sono strutture fisiche memorizzate nel database. Mentre le chiavi sono strutture logiche. 

Un indice può essere reso invisibile o inutilizzabile. Così non sarà più utilizzato dall’optimizer, Se inutilizzabile, sarà eliminato il segmento dove è stato memorizzato.

Indice composto:

  • è un indice su più colonne. Porre l’ordine secondo un senso di priorità, infatti una SELECT sarà velocizzata se nella WHERE ci saranno tutte le colonne dell’indice composto o le prime. Porre per primi le colonne con cardinalità elevata: cioè il numero di possibili valori in relazione al numero di righe della tabella.
  • se più indici hanno lo stesso set di colonne e non differiscono per tipo o schema di partizionamento allora devono usare diverse permutazioni delle colonne.
  • indici non-univoci che cioè possono avere più righe con gli stessi valori sono ordinati utilizzando le colonne della chiave più il rowid ascendente

Tipi di indici:

  • b-tree (balanced-tree), è il tipo di default ed è adatto per gli indici selettivi (poche righe corrispondono ad una entry della chiave) e le chiavi primarie. E’ una lista ordinata di valori divisi in range ed è formato da rami (contenenti i range di valori) e le foglie (contenenti i puntatori ai dati, valore indicizzato + rowid). L’altezza di un indice è il numero di blocchi per andare dal ramo all’ultima foglia. Il livello del ramo è l’altezza meno 1.

    Ne esistono i seguenti 4 sottotipi:

    • tabelle index-organized: in una tabella index-organised i dati sono loro stessi degli indici;
    • reverse-key: in questo caso gli indici sono memorizzati con i bytes ivertici per poter utilizzare molti blocchi;
    • descending: memorizzano i dati di una o più colonne i ordine discendente;
    • b-tree cluster: invece di memorizzare il puntatore alla riga che contiene i dati dell’indice, punta ai blocchi di memoria che contengono quelle righe;
  • bitmap o Bitmap join:  usa un bitmap per puntare a righe multiple;
  • function-based: contiene colonne che possono essere trasformate tramite funzioni;
  • application domain: gestisce dati di uno specifico application-domain. Non rispecchia la classica struttura di un indice e può essere immagazzinato anche fuori da Oracle;

Gli indici, una volta creati, sono mantenuti da Oracle a fronte di ogni operazione DML sui dati in modo trasparente agli utenti. Per questo è meglio gestirli in modo ragionato per non sovraccaricare il database di eccessivo lavoro. Se un’istruzione SQL accede solo colonne indicizzate allora il database legge direttamente l’indice e non la tabella. In caso di colonne miste tipicamente il database legge alternativamente index-block e table-block.

Full Scan Index:  viene scorso l’intero indice  e il predicato ha almeno una colonna indicizzata  (a volte anche senza). Può non essere necessario il sorting poiché i dati sono già ordinati tramite la chiave dell’indice.

Fast Full Scan index: è un FULL INDEX SCAN dove i dati richiesti sono tutti campi presenti nell’indicesenza la necessità di un ordinamento. Non deve apparire una riga con tutti NULL e perciò una delle colonne dell’indice deve essere NOT NULLABLE o i valori NULL eliminati grazia alla clausola WHERE.

Index Range Scan: quando è scorso in modo ordinato un indice dei quali 1 o più colonne fanno parte del predicato e 0,1 o più valori sono possibili per una sola chiave. E’ usato a seconda della selettività e qunado nel predicato c’è la richiesta di un range (between,  >, <). L’indice cerca la foglia corrispondente a valore più basso del range, dopodichè si sposta orizzontalmente attraverso le foglie adiacenti.

Index Unique Scan: diversamente dal INDEX RANGE SCAN deve avere 0 o 1 valore possibile associato ad una chiave. Il predicato deve contenere tutte le colonne dell’indice di tipo unique e usare l’operatore di =. L’indice interrompe la ricerca alla prima occorrenza poichè non ce ne possono essere altre.

Index Skip Scan: risulta performante se esistono pochi valori della principale colonna dell’indice e molti nelle restanti colonne contenute nell’indice composito. Il database opera creando dei sottoindici, uno per ogni valore della colonna principale e scansiona solo quello presente nella riga ricercata dal predicato. Non è necessario che il predicato contenga il campo principale dell’indice.