Strutture fisiche di accesso Esercitazioni - Basi di dati (complementi) Autore: Dr. Simone Grega Esercizio 1 Siano date le seguenti informazioni: B=4096 bytes la dimensione di un blocco H=12 bytes la dimensione dell header del blocco RH=10 la dimensione dell header del record R=120 bytes la dimensione totale dei campi di un record Sapendo che si vogliono memorizzare 10.000 record e che la dimensione di ogni record è fissa, calcolare quanti blocchi sono necessari per memorizzare l intera relazione. 1
Soluzione esercizio 1 BFR = (Dim Block dim BH)/(dim RH + dim R) = (4096-12)/(10+120)=31,4xxxx = 31 NB=Numero Record/bfr= 10.000/31=322,58xxxx=323 ATTENZIONE nei prossimi esercizi di solito vengono trascurate, sia per il blocco che per i record, le dimensione degli header. Esercizio 2 Si considerino i dati dell esercizio precedente, e si ipotizzi di avere una struttura sequenziale ordinata con possibilità di overflow. Utilizzando l approccio linked list e sapendo che la dimensione di un puntatore è di 4 bytes Calcolare il numero di blocchi necessari alla memorizzazione di 10.000 record. 2
Soluzione esercizio 2 Soluzione esercizio 2 BFR = (Dim Block dim BH)/(dim RH + dim R + Puntatore)=(4096-12)/(10+120+4) = 30 NB = Numero Record/bfr = 10.000 / 30 = 334 3
Esercizio 3 Si consideri una base di dati gestita tramite hashing, il cui campo chiave contenga i seguenti nominativi: Green, Lovano, Osby, Peterson, Pullen Scofield, Allen, Haden, Sheep, Harris, MacCann, Mann, Brown, Hutcherson, Newmann, Ponty, Cobbham, Coleman, Mingus, Lloyd, Tyner, Fortune, Coltrane. Proporre un algoritmo di hashing con B=8 e F=4 (ovvero 8 bucket e 4 record per bucket). Teoria: Funzione Hash Funzione hash: Associa ad ogni valore della chiave un "indirizzo", in uno spazio di B blocchi o bucket; Ogni bucket contiene in generale F > 1 record. La funzione non è iniettiva e quindi esiste la possibilità di collisioni (chiavi diverse che corrispondono allo stesso indirizzo) Composta da due fasi: Folding: mappa i valori della chiave su interi positivi uniformemente distribuiti su un range ampio (es. somma dei bytes associati ai caratteri della chiave); Hashing: mappa un intero positivo su un range (0,B-1) (es. Funzione modulo B). 4
Soluzione esercizio 3 Una semplice funzione di hashing per i nomi dati è: Per ogni carattere del nome, considerare il corrispondente numero di ordine alfabetico (a=1, b=2 ): Sommare tutti i numeri ottenuti Fare il modulo B della divisione In questo caso otteremo per ogni nome un numero compreso tra 0 e B-1. ESEMPIO: Hash(Green)=(7+18+5+5+14) mod 8 = 1 Hash(Lovano)=(12+15+22+1+13+15) mod 8 = 6 Hash(Osby)=(15+19+2+25) mod 8 = 5 Hash(Peterson)=(16+5+20+5+18+19+15+13) mod 8 = 7 Esercizio 4 Sia data la seguente funzione hash h(x)=x mod 3 e i seguenti valori: 3, 4, 5, 6, 7, 8, 9, 13, 15, 24, 28 Calcolare il numero di collisioni e il tempo di accesso medio assumendo bucket prima di dimensione 1 poi di dimensione 4. 5
Soluzione esercizio 4 h(3)=3 mod 3 = 0 h(4)=4 mod 3 = 1 h(5)=5 mod 3 = 2 h(6)=6 mod 3 = 0 h(7)=7 mod 3 = 1 h(8)=8 mod 3 = 2 h(9)=9 mod 3 = 0 h(13)=13 mod 3 = 1 h(15)=15 mod 3 = 0 h(24)=24 mod 3 = 0 h(28)=28 mod 3 = 1 5 collisioni sul bucket 0 4 collisioni sul bucket 1 2 collisioni sul bucket 2 Bucket di dimension 1: 3 record in posizione giusta, 8 overflow Tempo medio: (3*1+8*2)/11= 1,72 Bucket di dimensione 4: Solo un overflow con il valore 24 Tempo medio: (10*1+1*2)/11=1.09 Esercizio 5 Considerare una relazione definita su vari attributi tra cui Matricola e Cognome, sotto le seguenti ipotesi: i record hanno lunghezza fissa pari a 110 byte e i campi Matricola e Cognome ne occupano rispettivamente 4 e 20. la relazione occupa 10.000 record il file system prevede blocchi da 500 byte nel file system i puntatori occupano 4 byte. Costruire una struttura fisica (aiutandosi eventualmente con disegni) che preveda: un indice primario su Cognome (e quindi una struttura ordinata su di esso). Assumere che il livello delle foglie dell albero abbia un puntatore per ogni blocco del file dei dati. un indice secondario, di tipo B+tree, su Matricola. Calcolare il numero di blocchi necessari per ciascuna struttura (cioe per il file dei dati e per ciascuno degli indici). Si suggerisce di calcolare prima il numero di blocchi per il file dei dati, e poi per i due file degli indici, dapprima per le foglie e poi per i livelli successivi. 6
Teoria: Formule per le dimensioni L numero di record nel file dati B dimensione dei blocchi R lunghezza dei record (fissa) K lunghezza del campo chiave P lunghezza dei puntatori/indirizzi (ai blocchi) N. di blocchi per il file dati: NF = L/ [B/R] N. di blocchi per un indice denso: ND = L / [B/(K+P)] N. di blocchi per un indice sparso: NS = NF / [B/(K+P)] dove [B/R] prendere parte intera inferiore [L/[B/R] prendere parte intera superiore File dati Soluzione esercizio 5 Calcoliamo quanti record entrano in un blocco: Fattore di blocco = 500/110 = 4 Calcoliamo il numero dei blocchi NB = 10.000/4 = 2.500 7
Soluzione esercizio 5 Indice primario: primo livello Dimensione del record = 20 + 4 = 24 Indice sparso: un puntatore a ogni blocco: Fattore di blocco = 500/24= 20 Numero blocchi = 2500/20= 125 Soluzione esercizio 5 Indice primario: secondo livello Numero blocchi = 125/20= 7 blocchi 8
Soluzione esercizio 5 Indice primario: terzo livello Numero blocchi =7/20= 1 blocco Teoria: Occupazione dei blocchi di memoria per un albero L occupazione di memoria, attraverso la strategia di esecuzione delle operazioni di aggiornamento e mantenuta tra il 50% e il 100% della occupazione teorica (statisticamente il 70% di riempimento e considerato ottimo) 9
Indice secondario Soluzione esercizio 5 indice denso: un record per ciascun record del file Dimensione del record= 4 + 4 = 8 Fattore di blocco = 500/8=62 Essendo un B-tree adottiamo il 70% di riempimento Fattore di blocco reale= 40 Numero blocchi = 10.000/40 = 250 blocchi Soluzione esercizio 5 Indice secondario: secondo livello Numero blocchi = 250/40=7 blocchi 10
Soluzione esercizio 5 Indice secondario: terzo livello Numero blocchi = 7/40= 1 blocco Esercizio 6 Supponiamo di avere un file ordinato con L=30,000 records R= 100 bytes (dimensione fissa) B= 1024 bytes Si vuole costurire un indice primario con: Chiave v= 9 bytes (su un campo che detta ordinamento in memoria) Block pointer P= 6 bytes Si vuole costruire un indice secondario con: Chiave v= 9 bytes (su un campo che non detta ordinamento in memoria) Block pointer P= 6 bytes 11
Soluzione esercizio 6 Il B/R =bfr= 1024/100= 10 record per blocco Il numero di blocchi necessari per il file è : L/ B/R = 30000/ 10 = 3000 Indice primario: la dimensione di ogni entry dell indice è Ri= (9+6)= 15 bytes Il bfr per l indice è: 1024/15= 68 entry per blocco Il numero totale di entry deve esser uguale al numero di blocchi nel data file ovvero 3000. Il numero di blocchi per l indice è quindi: Bindex= 3000/ 68 =45 Soluzione esercizio 6 Indice secondario: La dimensione di ogni entry dell indice è Ri= (9+6)= 15 bytes Il bfr per l indice è: 024/15=68 entry per blocco Il numero totale di entry deve esser uguale al numero di record nel data file ovvero 30000 Il numero di blocchi per l indice è quindi: Bindex= 30000/ 68 =442 12
Esercizio 7 Si consideri una relazione IMPIEGATO(Matricola, Cognome, Nome, DataNascita) con un numero di tuple pari a L abbastanza stabile nel tempo e una dimensione di ciascuna tupla (a lunghezza fissa) pari a R byte, di cui K per la chiave. Supporre di avere a disposizione un DBMS che permetta strutture fisiche disordinate e hash e che preveda la possibilità di definire indici secondari e operi su un sistema operativo che utilizza blocchi di dimensione B e con puntatori ai blocchi di P caratteri. Le operazioni principali siano le seguenti: ricerca esatta sul numero di matricola con frequenza f1; ricerca sul cognome (anche su sottostringa iniziale) con frequenza f2; mediamente una richiesta restituisce 4 record. Individuare alcune (almeno una) possibili organizzazioni fisiche per tale relazione e calcolare (approssimativamente) il numero di accessi a memoria secondaria (nell unità di tempo) supponendo L =5.000.000, R = 125, K = 5, B = 1.000, P = 4, f1 = 100, f2 = 1.000. Soluzione esercizio 7 Una possibile organizzazione fisica per tale relazione è: una struttura hash sulla matricola un indice secondario (un albero B+) sull attributo cognome. Esaminiamo l albero: Ipotizziamo dimensione attributo cognome pari a 20 caratteri. Il nostro Fattore di blocco per l albero B+ sarà quindi: 1.000/(20+4) = 41.6 arrotondato a 41. Essendo un B-tree adottiamo il 70% di riempimento (quindi bfr=28) La profondità del nostro albero per L = 5.000.000 sarà pari a 5 livelli. (5.000.000/28= 178.572 /28 = 6378/28= 228/28= 9/28=1) 13
Soluzione esercizio 7 Analizzando il numero di accessi per le interrogazioni ottengo che: L operazione 1 (con Hash) ha un costo di 1 accesso in memoria per 100 volte, pari a 100 accessi in memoria. L operazione 2 (con B+tree) ha un costo di 5 accessi in memoria per trovare una corrispondenza, alla quale vanno aggiunti 4 accessi (scorrendo l albero,) per ottenere i quattro record forniti mediamente. Moltiplicando quindi accessi per una ricerca per la frequenza f2 di 1.000 ottengo un totale di 9.000 accessi in memoria. Questa organizzazione ha un costo di 9.000 + 100 = 9.100 accessi 14