1.23k likes | 1.42k Views
Architettura di un DBMS. Un DBMS deve garantire una gestione dei dati: efficiente concorrente affidabile integra sicura (protetta) Ciascuno degli aspetti precedenti è supportato dal DBMS da specifiche componenti, che complessivamente rappresentano l’architettura del sistema.
E N D
Architettura di un DBMS • Un DBMS deve garantire una gestione dei dati: • efficiente • concorrente • affidabile • integra • sicura (protetta) • Ciascuno degli aspetti precedenti è supportato dal DBMS da specifiche componenti, che complessivamente rappresentano l’architettura del sistema
Componenti di un DBMS • Efficienza: • File system: gestisce l'allocazione dello spazio su disco e le strutture dati usate per rappresentare le informazioni memorizzate su disco • Buffer manager: responsabile del trasferimento delle informazioni tra disco e main memory • Query parser: traduce i comandi del DDL e del DML in un formato interno (parse tree) • Optimizer: trasforma una richiesta utente in una equivalente ma più efficiente
Componenti di un DBMS • Affidabilità: • Recovery manager: assicura che il DB rimanga in uno stato consistente a fronte di cadute del sistema • Concorrenza: • Concurrency controller: assicura che interazioni concorrenti procedano senza conflitti • Integrità: • Integrity manager: controlla che i vincoli di integrità (per esempio le chiavi) siano verificati • Sicurezza • Authorization manager: controlla che gli utenti abbiano i diritti di accesso ai dati
Componenti di un DBMS • Un DBMS contiene inoltre alcune strutture dati che includono: • i file con i dati (cioè i file per memorizzare il DB stesso) • i file dei dati di sistema (che includono il dizionario dei dati e le autorizzazioni) • indici (esempio Btree o tabelle hash) • dati statistici (esempio il numero di tuple in una relazione) che sono usati per determinare la strategia ottima di esecuzione
Efficienza • Finora (Basi di dati 1) abbiamo visto modelli di DBMS ad alto livello (livello logico) • Tale livello è il livello corretto per gli utenti del DB • Un fattore importante nell'accettazione da parte dell'utente è dato dalle prestazioni • Le prestazioni del DBMS dipendono dall'efficienza delle strutture dati e dall'efficienza del sistema nell'operare su tali strutture dati
Efficienza • Esistono varie strutture alternative per implementare un modello dei dati • La scelta delle strutture più efficienti dipende dal tipo di accessi che si eseguono sui dati • Normalmente un DBMS ha le proprie strategie di implementazione di un modello dei dati • Tuttavia l'utente (esperto) può influenzare le scelte fatte dal sistema (livello fisico)
Mapping di relazioni a file • Per DBMS di piccole dimensioni (es. per PC) una soluzione spesso adottata è di memorizzare ogni relazione in un file separato • nel caso di DBMS large-scale questa strategia di base deve essere estesa (molto spesso il DBMS deve poter allocare in modo opportuno i record ai blocchi per minimizzare le operazioni di I/O) • una strategia frequente è di allocare per il DBMS un unico grosso file, in cui sono memorizzate tutte le relazioni • la gestione di questo file è lasciata al DBMS
Clustering • Si consideri la seguente interrogazione: SELECT Imp#, Nome, Sede FROM Impiegati, Dipartimenti WHERE Impiegati.Dip# = Dipartimenti.Dip# • una strategia di memorizzazione efficiente è basata sul raggruppamento (clustering) delle tuple che hanno lo stesso valore dell'attributo di join • il clustering può rendere inefficiente l'esecuzione di altre interrogazioni • es. SELECT * FROM Dipartimenti
Strutture ausiliarie di accesso • Spesso le interrogazioni accedono solo un piccolo sottoinsieme dei dati • Per risolvere efficientemente le interrogazioni può essere utile allocare delle strutture ausiliarie che permettano di determinare direttamente i record che verificano una data query (senza scandire tutti i dati)
Strutture ausiliarie di accesso • Ogni tecnica deve essere valutata in base a: • tempo di accesso • tempo di inserzione • tempo di cancellazione • occupazione di spazio • Molto spesso è preferibile aumentare l'occupazione di spazio se questo contribuisce a migliorare le prestazioni • Si usa il termine chiave di ricerca per indicare un attributo o insieme di attributi usati per la ricerca (diverso dalla chiave primaria)
Strutture ausiliarie di accesso • Una ricerca può essere effettuata per: • chiave primaria: il valore della chiave identifica un unico record • Es. il contribuente con codice fiscale GRRGNN69R48 • chiave secondaria: il valore della chiave può identificare più record • Es. i contribuenti di Genova • intervallo di valori (sia per chiave primaria che per secondaria) • Es. i contribuenti con reddito compreso tra 60 e 90 milioni • combinazioni delle precedenti • Es. i contribuenti di Genova e La Spezia con reddito compreso tra 60 e 90 milioni
Strutture ausiliarie di accesso • Per effettuare la ricerca in modo più efficiente si può pensare di mantenere il file ordinato secondo il valore di una chiave di ricerca • in questo caso però la ricerca su altri campi è inefficiente
Strutture ausiliarie di accesso • Organizzazioni primarie: • impongono un criterio di allocazione dei dati (organizzazioni ad albero o hash) • organizzazioni secondarie: • uso di indici (separati dal file dei dati) normalmente organizzati ad albero • in generale si hanno a disposizione più modalità (cammini) di accesso ai dati
Indici • Idea base: associare al file dei dati una “tabella'’ nella quale l'entrata iesima memorizza una coppia (ki ,ri ) dove: • ki è un valore di chiave del campo su cui l'indice è costruito • ri è un riferimento al record (ai record) con valore di chiave ki • il riferimento può essere un indirizzo (logico o fisico) di record o di blocco
Indici: esempio • File dei dati: chiavi c5 c2 c11 c7 c4 indirizzi 0 8 16 32 48 • indice: chiave ki indirizzo ri c2 8 c4 48 c5 0 c7 32 c11 16
Indici • Le diverse tecniche differiscono nel modo in cui organizzano l'insieme di coppie (ki ,ri ) • vantaggio nell'uso di un indice: • la chiave è solo parte dell'informazione contenuta in un record, quindi l'indice occupa meno spazio del file dei dati • un indice può comunque raggiungere notevoli dimensioni che determinano problemi di gestione simili a quelli del file dei dati
Indici • Esempio: • Indice per un file di 50k record, in cui i valori di chiave sono stringhe di 20 byte e i puntatori sono di 4 byte, richiede circa 1,2Mb • ogni entrata nell’indice: 20 + 4 byte • numero max entrate: 50 k • totale: 24 * 50 K = 1,2 Mb
Tipi di indice • Gli indici possono essere classificati rispetto a diverse dimensioni: • unicità valori chiave di ricerca • ordinamento dei record nel file di dati • numero di entrate nell’indice • numero di livelli
Unicità dei valori di chiave • Indice su chiave primaria: • indice su un attributo che è chiave primaria per la relazione (a ogni entrata dell'indice corrisponde un solo record) • Indice su chiave secondaria: • indice su un attributo che non è chiave primaria per la relazione (ad ogni entrata dell'indice possono corrispondere più record)
Ordinamento dei record nel file dei dati • Indice clusterizzato (o indice primario): • indice sull'attributo secondo i cui valori il file dei dati è mantenuto ordinato • indice non clusterizzato (o indice secondario): • indice su un attributo secondo i cui valori il file dei dati non è mantenuto ordinato
Numero di coppie nell’indice • Indice denso • indice il cui numero di entrate (ki, ri) è pari al numero di valori di ki • Indice sparso • indice il cui numero di entrate (ki, ri) è minore del numero di valori di ki
Numero di livelli • Indice a singolo livello • indice organizzato su un singolo livello • Indice multilivello • indice organizzato su più livelli
Indici densi e sparsi • Indice denso: l'indice contiene un'entrata per ogni valore della chiave di ricerca nel file • Ricerca: scansione per trovare il record con valore chiave uguale al valore cercato • recupero dati fino a che il valore non cambia • Indice sparso: le entrate dell'indice sono create solo per alcuni valori della chiave. • Ricerca: scansione fino a trovare il record con il più alto valore della chiave che sia minore o uguale al valore cercato • scansione sequenziale del file dei dati fino a trovare il record cercato
Indici densi e sparsi • Un indice denso consente una ricerca più veloce, ma impone maggiori costi di aggiornamento • Un indice sparso è meno efficiente ma impone minori costi di aggiornamento • Poiché molto spesso la strategia è di minimizzare il numero di blocchi trasferiti, un compromesso spesso adottato consiste nell'avere una entrata nell'indice per ogni blocco
Indici multilivello • Un indice anche se sparso può essere di dimensioni notevoli • Esempio: • file di 100000 record, con 10 record per blocco, richiede un indice con 10000 entrate • se ogni blocco contiene 100 entrate dell’indice: 100 blocchi
Indici multilivello • Se l’indice è piccolo, può essere tenuto in memoria principale • molto spesso, però, è necessario tenerlo su disco e la scansione dell’indice può richiedere parecchi trasferimenti di blocchi • circa 7 nel nostro esempio, se si utilizza ricerca binaria • Soluzione: • si tratta l’indice come un file e si alloca un indice sparso sull’indice stesso • si parla di indice sparso a due livelli
Indici multilivello • se l’indice esterno è mantenuto in memoria principale basta accedere un solo blocco di indice
Tecniche di indicizzazione • Le strutture per MS differiscono da quelle per MM perché si cerca di minimizzare il numero di blocchi acceduti (che determina il costo della ricerca) • basate su alberi (B-tree e varianti) • basate su tabelle hash
B-Alberi • i B-alberi sono organizzazioni ad albero bilanciato, utilizzate come strutture di indicizzazione per dati in memoria secondaria • requisiti fondamentali per indici per memoria secondaria: • bilanciamento: l’indice deve essere bilanciato rispetto ai blocchi e non ai singoli nodi (è il numero di blocchi acceduti a determinare il costo I/O di una ricerca) • occupazione minima: è importante che si possa stabilire un limite inferiore all’utilizzazione dei blocchi, per evitare una sotto-utilizzazione della memoria • efficienza di aggiornamento: le operazioni di aggiornamento devono avere costo limitato
B-alberi • garantiscono un’occupazione di memoria almeno del 50% (almeno metà di ogni pagina allocata è effettivamente occupata) • consentono di effettuare l’operazione di ricerca con costo, nel caso peggiore, logaritmico nella cardinalità dell’indice (cioè nel numero di valori distinti della chiave di ricerca) • in un B-albero ogni nodo ha al più m figli, dove m è l’unico parametro dipendente dalle caratteristiche della memoria, cioè dalla dimensione del blocco
B-alberi • Un B-albero di ordine m (m 3) è un albero bilanciato che soddisfa le seguenti proprietà: • ogni nodo contiene al più m - 1 elementi • ogni nodo contiene almeno elementi, • la radice può contenere anche un solo elemento • ogni nodo non foglia contenente j elementi ha j +1 figli • ogni nodo ha una struttura del tipo: p0(k1, r1)p1(k2, r2)p2 . . . pj-1(kj, rj)pj dove j è il numero degli elementi del nodo
B-alberi In ogni nodo p0(k1, r1)p1 (k2, r2)p2 . . . pj-1(kj, rj)pj • k1, ... , kj sono chiavi ordinate, cioè k1 < k2 < ... < kj • nel nodo sono presenti j + 1 riferimenti ai nodi figli p0,..., pj e j riferimenti al file dei dati r1, ... , rj • per ogni nodo non foglia, detto K(pi) (i = 1, ... , j) l’insieme delle chiavi memorizzate nel sottoalbero di radice pi, si ha: • y K(p0), y < k1 • y K(pi), ki < y < ki+1, i = 1, ... , j - 1 • y K(pj), y > kj
B-alberi • Formato di un nodo di un B-albero
B-alberi • Esempio di B-albero di ordine 5
B+-alberi • Un B-albero è molto efficiente per la ricerca e la modifica dei singoli record • ad esempio, con m = 100 e N = 1000000 la ricerca di una chiave comporta al massimo 4 accessi a disco • un B-albero non è però particolarmente adatto per elaborazioni di tipo sequenziale nell’ordine dei valori di chiave, né per la ricerca dei valori di chiave compresi in un certo intervallo • la ricerca del successore di un valore di chiave può comportare la scansione di molti nodi • per ovviare a questo problema è stata proposta una variante dei B-alberi, nota come B+-alberi
B+-alberi • Idea principale: in un B-albero, i valori di chiave svolgono una duplice funzione: • separatori: per determinare il cammino da seguire nella ricerca • valori di chiave: permettono di accedere all’informazione ad essi associata • nei B+-alberi queste funzioni sono mantenute separate: • le foglie contengono tutti i valori di chiave • i nodi interni (organizzati a B-albero) memorizzano dei separatori la cui sola funzione è determinare il giusto cammino nella ricerca di una chiave
B+-alberi • i nodi foglia sono inoltre collegati a lista, per facilitare ricerche per intervalli di chiavi o sequenziali (+ puntatore alla testa di tale lista, per accedere velocemente al valore di chiave minimo) • parziale duplicazione delle chiavi • le entrate dell’indice (chiavi e riferimenti ai dati) sono solo nelle foglie • la ricerca di una chiave deve individuare una foglia
B+-alberi • il sottoalbero sinistro di un separatore contiene valori di chiave minori del separatore, quello destro valori di chiave maggiori od uguali al separatore • nel caso di chiavi alfanumeriche facendo uso di separatori di lunghezza ridotta si risparmia spazio
B+-alberi • Un B+-albero di ordine m (m 3) è un albero bilanciato che soddisfa le seguenti proprietà: • ogni nodo contiene al più m - 1 elementi • ogni nodo, tranne la radice, contiene almeno elementi, la radice può contenere anche un solo elemento • ogni nodo non foglia contenente j elementi ha j +1 figli
B+-alberi • ogni nodo foglia ha una struttura del tipo: (k1, r1)(k2, r2) . . . (kj, rj) dove: • j è il numero degli elementi del nodo • k1, ... , kj sono chiavi ordinate, cioè k1 < k2 < ... < kj • r1, ... , rj sono j riferimenti al file dei dati • ogni nodo foglia ha un puntatore al nodo foglia precedente e successivo
B+-alberi • ogni nodo non foglia ha una struttura del tipo: p0k1p1k2p2 . . . pj-1kjpj dove: • j è il numero degli elementi del nodo • k1, ... , kj sono chiavi ordinate, cioè k1 < k2 < ... < kj • p0, … , pj sono j+1 riferimenti ai nodi figli
B+-alberi • per ogni nodo non foglia, detto K(pi) (i = 0, ... , j) l’insieme delle chiavi memorizzate nel sottoalbero di radice pi, si ha: • y K(p0), y < k1 • y K(pi), ki y < ki+1, i = 1, . . . , j - 1 • y K(pj), y kj • ogni ki, per i = 1, . . . , j è l’elemento minimo di K(pi)
B+-alberi • Esempio di B+-albero di ordine 5
B+-alberi: confronto con B-alberi • HP: parità di dimensione dei nodi • la ricerca di una singola chiave è più costosa in media in un B+-albero (si deve necessariamente raggiungere sempre la foglia per ottenere il puntatore ai dati) • per operazioni che richiedono il reperimento dei record ordinati in base al valore della chiave o per intervalli di chiave i B+- alberi sono da preferirsi (il collegamento a lista delle foglie elimina la necessità di accedere ai nodi ad altri livelli) • il B-albero è più conveniente per quanto riguarda l’occupazione di memoria (le chiavi sono memorizzate una volta sola)
Organizzazioni hash • Le organizzazioni hash sono usate principalmente per l’organizzazione primaria dei dati • l’uso di indici ha lo svantaggio che è necessario eseguire la scansione di una struttura dati per localizzare i dati • questo perché l’associazione (chiave, indirizzo) è mantenuta in forma esplicita • un’organizzazione hash utilizza una funzione hash H che trasforma ogni valore di chiave in un indirizzo • per effettuare la ricerca, data una chiave k, si calcola semplicemente H(k)