CALCOLO DEL COSTO DI ACCESSO AI DATI costo di accesso 1 Nelle lezioni precedenti Avete visto: i le basi di dati relazionali ed il linguaggio SQL la struttura dei files gli indici B + tree questa è dedicata al calcolo del costo di accesso ai dati (tuple) costo di accesso 2
scopo: scopo della lezione valutare quale sia la migliore strategia di accesso per interrogazioni SQL sia su singola relazione sia nel caso di join i criteri di valutazione servono anche a prendere decisioni sull ordinamento delle relazioni e quali indici costruire costo di accesso 3 ottimizzatori I criteri che vedremo sono in linea con i metodi e le scelte utilizzati dai query-optimizer dei DBMS relazionali lo scopo dei query-optimizer è infatti valutare quale sia la migliore strategia di accesso (access path) per le interrogazioni SQL degli utenti gli ottimizzatori non prendono decisioni sull ordinamento delle relazioni e su quali indici costruire queste decisioni sono lasciate al DBA che deve valutare sulla base del carico di lavoro costo di accesso 4
decisioni quali indici? index scan relation scan Relazione di NT tuple in NB blocchi (pagine) costo di accesso 5 utilizzo degli indici Un indice può essere utilizzato per eseguire una interrogazione SQL se l attributo su cui è costruito: compare nella clausola WHERE è contenuto in un FATTORE BOOLEANO il fattore booleano è ARGOMENTO DI RICERCA attraverso indice compare in un ORDER BY o GROUP BY costo di accesso 6
utilizzo degli indici Esempi: per la relazione IMPIEGATI ( matr, cognome, nome, lavoro, qualifica, salario, straordinario, dno) 1) la query: SELECT cognome, salario FROM impiegati WHERE dno = 51 AND salario > 2000 AND (lavoro = fattorino OR lavoro = guardiano ) oppure. costo di accesso 7 utilizzo degli indici 2) la query: SELECT cognome, salario FROM impiegati WHERE dno = 51 AND salario + straordinario > 3000 AND (lavoro = fattorino OR qualifica = 7) costo di accesso 8
utilizzo degli indici Separazione della condizione WHERE in fattori booleani: un predicato è un fattore boleano se è collegato alla radice del WHERE-tree da AND (query 1) AND AND dno = 51 salario > 2000 lavoro = fattorino OR lavoro = guardiano costo di accesso 9 utilizzo degli indici un predicato è un fattore boleano se con risultato falso determina il risultato falso per la query AND AND (query 2) dno = 51 salario + straordinario > 3000 lavoro = fattorino OR qualifica = 7 costo di accesso 10
utilizzo degli indici 1) per la query 1 sono fatt. bool. argomenti di ricerca: dno = 51, salario > 2000 (lavoro = fattorino OR lavoro = guardiano ) dno salario lavoro costo di accesso 11 utilizzo degli indici 2) per la query 2 è fatt. bool. argomento di ricerca solo: dno = 51 per (lavoro = fattorino OR qualifica = 7) se il DBMS può usare più indici per una query: lavoro + qualifica si può effettuare l unione delle liste di TID costo di accesso 12
utilizzo degli indici 2) per la query 2 è non è fatt. bool. argomento di ricerca: salario + straordinario > 3000 sia che il DBMS possa usare più indici per una query che uno solo : salario straordinario??? non si può effettuare l unione delle liste di TID costo di accesso 13 utilizzo degli indici per una query sono argomento di ricerca i predicati del tipo: attributo. comparatore. valore, ad es.: dno = 47 (<, < =,> =, >, between) SI dno = $D (variabile di programma) SI dno = 47 OR dno = 32 SI (IN corrisponde ad OR ma non sempre è SI) (dno = 47) OR (qualifica = 3) SI/NO salario + straordinario > 3000 NO salario = straordinario (stessa relazione) NO costo di accesso 14
modello di costo Un indice è utile per una query solo se il costo di accesso con l indice è < costo dell accesso sequenziale cioè < NB ( NB/2 se attributo unique) il modello comunemente utilizzato (ce ne sono di molto più sofisticati e precisi) serve per previsioni di massima e si basa su: per la relazione : NT, NB per ogni indice :NL (numero di foglie) per ogni attributo :NK (cardinalità), max, min tutti valori desumibili dai cataloghi dei DBMS le grandezze sono uniformemente distribuite costo di accesso 15 selettività Un predicato è selettivo se ci si aspetta che non tutte le tuple lo soddisfino fattore di selettività (filtro) F di un predicato : frazione di tuple che soddisfano il predicato nt / NT = valori selezionati / NK = SK / NK A = valore F = 1 / NK A dno = 24 F dno = 1/ Nk dno, default = 1/10 A IN (val1, val2, val3 ) F = 3 / NK A dno IN ( 24, 36) F dno = 2/ NK dno analogamente per dno = 24 OR dno = 36 in generale F= numero valori/ NK A, default = 1/2 costo di accesso 16
selettività A > valore F = SK / NK A, default f=1/3 voto > 27 F voto = 4/ 15 se i voti vanno da 17 a 31 e supponendo che tutti siano stati assegnati almeno una volta per salario > 2000 (range la cui cardinalità non è controllabile) si può prendere: F salario = (max(sal) - 2000) / (max(sal) - min(sal)) analogamente per BETWEEN 2000 AND 3500 F salario = (3500-2000) / (max(sal) - min(sal)) default f=1/4 costo di accesso 17 selettività Predicati su attributi diversi pred1 OR pred2 : F = F pred1 +F pred2 -F pred1 F pred2 attributo A = attributo B F = 1 / max(nk A, NK B ) se i due domini sono sovrapposti, altrimenti F=0 - negazione : A = not valore F = 1-1 / NK A per ottenere maggiori precisioni molti sistemi memorizzano istogrammi semplificati costo di accesso 18
selettività Numero di tuple del risultato: E = NT F pred1 e nell ipotesi di assenza di correlazione tra i valori degli attributi, per più predicati: E = NT Π i F predi - l ipotesi non è sempre verificata, bisognerebbe rilevare un fattore di correlazione o di clustering relativo tra valori di attributi differenti:. tipo di lavoro, data di nascita: incorrelati. qualifica, dipartimento: correlati costo di accesso 19 costo di accesso I casi esaminati si differenziano a seconda che: indice clustered / unclustered attributo unique / con ripetizione dei valori predicato di uguaglianza / di range / OR uso di un solo indice / più indici costo di accesso 20
Ipotesi di buffer Si considera, per ogni relazione o indice, che ogni cambio di riferimento a pagina referenzi una pagina fuori dal buffer di memoria centrale. E come se ogni relazione (o indice ) avesse una sola pagina di buffer in memoria centrale. E un ipotesi pessimistica che tende a calcolare upper bounds. costo di accesso 21 costo di accesso Il costo C è dato dalla somma : C indice + C relazione costo di accesso 22
costo di accesso indice clustered / unclustered su attributo unique con predicato di uguaglianza: esempio, matr = 236 (sulla relazione impiegati) foglia indice Costo = 1 foglia + 1 blocco = 2 blocco dati se l indice è clustered o unclustered è lo stesso costo di accesso 23 costo di accesso indice clustered con E > 1: matr between 236 and 312, lavoro = guardiano Costo = F NL + F NB costo di accesso 24
costo di accesso indice unclustered / clustered : lavoro = guardiano Costo = ( F NL + F NT ) con F = F valore analogamente per il caso clustered Costo = ( F NL + F NB ) costo di accesso 25 costo di accesso indice unclustered / clustered (predicato OR): lavoro = guardiano OR portiere Costo = 2 ( F NL + F NT ) sono 2 accessi distinti, analogamente per il caso clustered Costo = 2 ( F NL + F NB ) con F = F valore costo di accesso 26
costo di accesso Uso di più indici unclustered con E > 1: intersezione /unione dei TID estratti dagli indici matr between 236 and 312, lavoro = guardiano Costo = Σ k F k NL k + Π k F k NT costo di accesso 27 costo di accesso Costo = Σ k F k NL k + Π k F k NT Questa formula è molto imprecisa perché presuppone la mancanza di correlazione tra attributi Questo metodo può essere migliorato aggiungendo indici k solo se portano un vantaggio di selettività al secondo termine superiore allo svantaggio introdotto nella sommatoria del primo costo di accesso 28
Esempio: costo di accesso SELECT * FROM IMPIEGATI WHERE lavoro = fattorino AND salario < 1500 con NT = 10000, NB = 1000, NK sal = 100 NK lav = 50 indici: clustered su salario con NL = 160 unclustered su lavoro con NL = 100 supponiamo che la selettività sia. F lav = 1 / 50 = 0.02 F sal = (1500 - min) / (max- min) = 0.1 costo di accesso 29 costo di accesso costo delle scansione sequenziale: C seq = 1000 costo dell indice su lavoro (unclust.): C lav = F lav NL lav + F lav NT = 0.02 100 + 0.02 10000 = 2 + 200 = 202 costo dell indice su salario (clust): C sal = F sal NL sal + F sal NB = 0.1 160 + 0.1 1000 = 16 +100 = 116 C seq > C lav >C sal costo di accesso 30
costo di accesso scambiamo adesso l ordinamento per gli indici: costo dell indice su lavoro (clust.): C lav = F lav NL lav + F lav NB = 0.02 100 + 0.02 1000 = 2 + 20 = 22 costo dell indice su salario (unclust): C sal = F sal NL sal + F sal NT = 0.1 160 + 0.1 10000 = 16 +1000 = 1016 C sal >C seq >C lav costo di accesso 31 costo di accesso tuple del risultato: E = F lav F sal NT = 20 la scelta migliore per la query è avere un ordinamento su lavoro e un indice su lavoro, mentre l indice su salario non deve essere costruito il miglioramento che si ottiene rispetto all assenza di indici e ordinamenti ò di 1 a 45 nel caso in cui l ordinamento su salario sia di utilità per altre query l indice unclustered su lavoro porta ad un miglioramento di 1 a 9 costo di accesso 32
uso degli indici Miglioramento della formula di costo nel caso di ordinamento dei TIDs valore array di E tids ordinati 1 2 NB RELAZIONE Quindi in generale si ha C relazione min(e, NB). costo di accesso 33 cardenas C relazione puo' essere calcolato meglio usando la formula di CARDENAS (Comm. ACM 1975): Φ (k,n) = n (1-(1-1/n) k ) C relazione = Φ (E,NB) = NB (1-(1-1/NB) E ) La formula e' valida sotto le seguenti ipotesi: a) tutti i record sono equiprobabili, b) tutti i blocchi contengono lo stesso numero di tuple, c) come conseguenza di a) e b) tutti i blocchi sono equiprobabili. costo di accesso 34
cardenas Φ(E,NB) può essere ricavata come segue: 1/NB è la probabilità che un blocco contenga una data tupla estratta dagli E, 1-1/NB è la probabilità che un blocco non contenga una data tupla estratta dagli E (1-1/NB) E è la probabilità che un blocco non contenga nessuna delle E tuple 1-(1-1/NB) E è la probabilità che un blocco contenga almeno una delle E tuple e quindi venga visitato, NB (1-(1-1/NB) E ) è il numero di blocchi che ci si aspetta contengano almeno una tupla costo di accesso 35 andamento di Φ L'andamento generale della Φ è riportato in figura: NB min(e,nb) cardenas E costo di accesso 36
andamento di Φ Tabella con NB = 100 La formula di Cardenas calcola in ogni caso il numero Φ di blocchi visitati (con qualsiasi successione). Il numero di accessi C relazione è calcolabile con la formula di Cardenas solo se i TIDs sono in ordine. E Φ 10 10 20 18 30 26 40 33 50 39 60 45 70 51 80 55 90 60 100 63 150 78 200 87 250 95 300 95 500 99 costo di accesso 37 utilizzo degli indici Caso di indice unclustered "localmente ordinato" : con i TIDs in ordine crescente per ogni valore della chiave... chiave + tids a b foglie indice..... a.. b... a.. b... b.. a... a.. b... n-ple costo di accesso 38
utilizzo degli indici Predicato : Col = valore C = F col NL + Φ(E,NB) dove E = F col NT Predicato di tipo : valore 1< Col < valore2 C = F col NL + K Φ(E/K,NB) dove K = F col NK costo di accesso 39 utilizzo degli indici Rivediamo i calcoli con Φ per l esercizio precedente con indici unclustered: predicato: lavoro = fattorino C = F lav NL lav + Φ(E,NB) dove E lav = F lav NT =200 C = F lav NL lav + Φ(200,1000) = 2 + 182 = 184 (era 202) costo di accesso 40
utilizzo degli indici Predicato : salario < 1500 C = F sal NL sal + K Φ(E sal /K,NB) dove K = F sal NK sal E sal /K = f sal NT dove f sal è il filtro per 1 valore di salario E sal /K = f sal NT = 10000/100 = 100 C = 16 + 10 Φ(100,1000) = = 16 + 952 = 968 (era 1016) costo di accesso 41 utilizzo degli indici Esempio: variazione con K NL = 1. 800, NR = 1. 000. 000, NK = 100. 000, NB = 100. 000 6 5 4 Costi ( x 100000 ) con indice 3 2 1 0 scan sequenziale 1 10 100 1000 10000 100000 K costo di accesso 42
utilizzo degli indici Le tuple del risultato vengono poi controllate con i predicati residui: SELECT * FROM IMPIEGATI WHERE lavoro = fattorino AND età < 35 AND salario + straordinario >3 predicato residuo La selettività dei predicati residui è difficile da calcolare costo di accesso 43 uso degli indici Perché non mettere indici su tutti gli attributi? Il query optimizer potrebbe poi scegliere. Gli indici devono essere mantenuti: caso DELETE: eliminazione di TID Costo = N ind E (N ind : numero indici E = E 2) costo di accesso 44
uso degli indici caso UPDATE: spostamento di TID Costo = N ind 2 E (N ind : numero indici E = E 2) Un numero indici troppo elevato comporta un eccessivo costo di modifica della relazione costo di accesso 45 rif. biblio.: Antonio Albano: Costruire sistemi per basi di dati. Addison Wesley 2001 contenuti: strutture files struttura DBMS recovery e concorrenza ottimizzatori DDBMS riferimenti: oracle, sybase, informix, DB2, SQl server costo di accesso 46
alcuni rif. biblio.: Validità di Φ: P.Ciaccia, D.Maio, P.Tiberio: "A unifying approach to evaluating block accesses in data base organizations." Information Proc. Lett., vol 28, no. 5, 1988. UPDATE: calcolo dei costi M.Schkolnick, P.Tiberio: "Estimating the cost of updates in a relational database". ACM Transactions on Database Systems, vol 10, 2, 1985. Calcolo dei costi e scelta degli indici: R.Bonanno, D.Maio, P.Tiberio: "An approximation algorithm for secondary index selection in relational database physical design". The Computer Journal, vol. 28, 4, 1985. S.Finkelstein, M.Schkolnick, P.Tiberio: "Physical database design for relational databases". ACM Transactions on Database Systems, marzo 1988. costo di accesso 47 La proiezione: proiezione SELECT DISTINCT A, C FROM REL Si ottiene costruendo un file con solo <A, C>, facendo il sort del file e poi eliminando gli uguali (oppure costruendo un indice multicolonna su A,C) Il costo sarà: C pj = NB + NB AC +C sort (NB AC ) + NB AC + N pj (bisogna calcolare la cardinalità della proiezione E pj e il numero di pagine che contengono il risultato N pj <NB AC <NB) costo di accesso 48
proiezione Le tuple risultato della proiezione sono distinte: SELECT DISTINCT A, C FROM REL Un calcolo approssimato del numero di tuple del risultato è il seguente: se NT sono le tuple di REL, NK A e NK C le cardinalità di A e C, NK A NK C sono le possibili coppie (a,c) di valori distinti, quindi E A,C è calcolabile con la formula di Cardenas: E A,C = Φ( NT, NK A NK C ) costo di accesso 49 proiezione Nel caso di query con selezione e proiezione: SELECT DISTINCT C FROM REL WHERE B = 10 NT/ NK B sono le tuple di REL che soddisfano il predicato, ciascuna di queste può assumere uno dei NK C valori di C, quindi E C è calcolabile con la formula di Cardenas: E C = Φ( NT/NK B,NK C ) costo di accesso 50
uso degli indici Gli indici servono per il controllo di unicità della chiave primaria. Gli indici clustered possono servire per l inserimento di tuple: se c è l indice clustered, seguendo l indice, alcuni DBMS cercano di inserire la nuova tupla in modo da mantenere l ordine, se non c è spazio nella pagina appropriata allora la tupla va in overflow; periodicamente la relazione viene riordinata e gli indici ricostruiti. in altri sistemi le nuove tuple vengono sempre aggiunte di seguito alle altre, degradando l ordinamento; periodicamente la relazione viene riordinata e gli indici ricostruiti. costo di accesso 51 METODI PER IL CALCOLO DEL NUMERO DI VALORI DISTINTI IN UN ATTRIBUTO DI UN FILE Se la colonna ha un indice, i valori distinti vengono contati con esattezza. Se non c è l indice il conteggio comporta un tempo di calcolo paragonabile alla costruzione di un indice (bisogna costruirlo o fare la proiezione). In entrambi i casi il calcolo va effettuato per ogni colonna SI PUO' USARE UN CONTEGGIO STATISTICO APPROSSIMATO costo di accesso 52
CONTEGGIO STATISTICO APPROSSIMATO Si predispone un buffer di lunghezza fissa con n posizioni di m bytes. Si sceglie una funzione hash per trasformare la chiave in m bytes. Si predispone una maschera di m*8 bits inizialmente tutti a 0 (ad esempio). Si leggono tutti i valori della chiave, si trasformano con la funzione hash e si inseriscono nel buffer se non già presenti. Quando il buffer si riempie si escludono tutti i valori che contengono un valore diverso da quello della maschera nel bit meno significativo; ciò consente di eliminare circa la metà dei valori presenti. costo di accesso 53 CONTEGGIO STATISTICO APPROSSIMATO L algoritmo riparte non facendo entrare nel buffer i valori con il 1 0 bit diverso da quello della maschera mentre fa entrare tutti gli altri. Quando nuovamente il buffer è pieno si eliminano i valori che hanno il 2 0 bit diverso da quello della maschera. etc.. Algoritmo: si predispone un buffer b vuoto per n valori di m bytes; si sceglie la funzione hash per trasformare ciscun valore in m bytes. costo di accesso 54
CONTEGGIO STATISTICO APPROSSIMATO mult 1, nvalb 0 repeat leggi il prossimo record VH hash (valore nella colonna) IF mult > 1 THEN escludi VH se dalla maschera per i valori da mult-1 ad 1; IF VH non è già in b THEN inserisci vh in b, nvalb nvalb +1; IF b e' pieno THEN si escludono da b tutti i valori il cui bit in posizione mult e' dal corrispondente bit della maschera, si compatta b e si conta nvalb, mult mult+1; until fine del file nval nvalb * 2 mult -1. nvalb mult nval : valori diversi contenuti nel buffer, : fattore moltiplicativo, : stima del numero di valori diversi. costo di accesso 55 CONTEGGIO STATISTICO APPROSSIMATO FILE CAMPO MASCHERA mult BUFFER se il buffer e' pieno allora scarta i valori e modifica mult v valore HASH? scartato scartato se gia' nel buffer costo di accesso 56
CONTEGGIO STATISTICO APPROSSIMATO La funzione hash è essenziale perché agisce da randomizzatore dei valori e rende giustificata l'ipotesi che ad ogni riempimento del buffer il controllo del valore 0/1 effettivamente elimini metà dei valori. Questo metodo può commettere in qualche caso errori grandi ma mediamente l'errore è, confinato tra il 10% ed il 5%. la stima è sufficiente per i calcoli di prima approssimazione. Un errore è anche introdotto dal fatto che le funzioni hash non sono perfette ma introducono collisioni per valori diversi. costo di accesso 57 Metodo linear counting Date N tuple, calcolare gli nval valori diversi contenuti in una colonna. La funzione hash questa volta pone ad 1 un bit in un array di m bit (con m molto grande). Alla fine del processo si conta il numero di zeri nz nell'array che rapportato ad m dà : p = nz/m = (1-1/m) nval ( 1/m è la probabilità che uno degli m bits corrisnda ad uno degli nval valori, 1-1/m è la prob. che il bit non corrisponda ad uno degli nval valori, p è la prob. che il bit non corrisponda ad alcuno degli nval valori) il numero di valori distinti è : nval = log e p/ log e (1-1/m) costo di accesso 58
Metodo linear counting colonna FILE valori HASH 001.. 1..0100.. 1 10000..10.. 1 bit array costo di accesso 59 Metodo linear counting Criteri di scelta di m: si usa una tabella N m 100 80 Esistono tabelle 200 106 precalcolate 500 172 che dato N 1000 268 dicono quanto 5000 948 deve essere 10000 1709 la dimensione m 50000 6909 del bit array per 100000 12744 avere un errore 500000 53848 minore del 10%. 1000000 100880 10000000 831809 50000000 3699768 costo di accesso 60
Metodo linear counting algoritmo linear counting inizializza la bitarray a 0 repeat leggi una tupla; vh hash(valore); bitarray [vh] 1; until fine del file nz numero di 0 in bitarray; nval log e p/ log e (1-1/m) p nz/m costo di accesso 61