Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Heap Organization
I dati sono ordinati nellordine di inserimento, le pagine sono quindi contigue e possono essere
rappresentate come una lista ordinata
Equality search:
(R)
Range Search:
Sequential Organization
I records sono salvati in ordine sequenziale rispetto a una search-key
Equality search:
(R)
Range Search:
Viene cercata una chiave nel range k1 <= k <= k2 il costo quindi
o Lg Npag(R) + Sf x Npag(R)
o Dove Sf il selectivity factor ottenuto come
Sf =
2 1
max min
Hashing Organization
Una table organization si dice:
Primary organization se determina il modo in cui I records sono fisicamente salvati e quindi come
possono essere recuperati. Si pu implementare come una funzione che mappa ogni chiave ad un
record. Una primary organization si dice
o Statica se una volta creata, con laggiunta di pagine si va in overflow ed necessario
riorganizzarla, degradando le performance
o Dinamica Se una volta creata la tabella si evolve gradualmente con laggiunta o la
rimozione di records
Altrimenti detta secondary organization. In questo caso la mappatura di ogni chiave a un record
implementata con un metodo tabulare, dove vengono elencati tutti gli input ed output. La
secondary organization aiuta a rispondere alle query senza modificare la locazione dei dati.
B+-Trees
Tutti i records sono salvati nele foglie, organizzate come una doppia linked list. Questa organizzazione
anche detta index sequential organization.
Clustered Index: Un clustered index su una chiave K di una tabella creato ordinando la tabella sui
valori della chiave K. Se vengono inseriti nuovi records lefficenza dellindice cala perch i dati non
sono pi ordinati fisicamente rispetto alla chiave k. Per cui a volte necessario ricreare lindice per
riordinare i dati. Esiste solo un clustered index. In pratica un clustered index ha una struttura
uguale a quella dei dati fisici.
Unclustered Index: Si usa una seconda tabella che contiene puntatori alla riga dei dati che contiene
la chiave. Quindi pi lungo il tempo di scrittura del dato. In pratica un unclustered index ha una
struttura che indica per ogni valore dellindice la posizione della riga contenente i dati della chiave
Range Search
Unclustered Index:
Sf() =
2 1
max min
Infatti i record non sono ordinati sullindice k quidi il numero di pagine da leggere Erec Per cui il costo
dato da:
Cs = Ci + CD = [ Sf() x Nleaf(Idx) ] + [ Sf() x Nrec(R) ] =
= [ Sf() x (Nleaf(Idx) + Nrec(R)) ]
Per operazioni con lindex pi conveniente rispetto ad una tableScan solo se Cs < Npag(R)
Clustered Index:
I records sono sempre ottenuti usando lindice, anche se stato costruito dai record ordinati, se ci sono
stati altri inserimenti non detto che i records siano ancora ordinati, si dice quindi che i record sono quasi
ordinati (almost sorted)
Il numero di pagine quindi per trovare Erec dato da:
Sf() x Npag(R)
Mentre il costo generale della ricerca con luso dellindice diventa:
Cs = Ci + CD = [ Sf() x Nleaf(Idx)] + [Sf() x Npag(R) ] =
= [ Sf() x (Nleaf(Idx) + Npag(R)) ]
Per operazioni con lindex pi conveniente rispetto ad una tableScan perch sempre < Npag(R)
Inverted indexes
Un inverted index I su un attrributo non chiave K di una tabella R una lista ordinate dei dati dove per ogni
valore k della chiave K vi un numjero di records n contenente quell dato valore e la lista ordinate dei RID
di quei record.
In pratica Dato un attributo non-chiave, viene creata una tupla composta da 3 elementi
Performance
Nrec(R)
Il numero di records di R
Npag(R)
LR
NI(R)
Numero di indici su R
LI
Il numero medio di bytes utilizzati per rappresentare il valore di una chiave sullindice I
Nkey(I)
Nleaf(I)
LRID
Equality Search
Operazione di ricerca per una condizione A = c oppure A = B
Cs = CI + CD
CI
Costo per accedere le pagine dellindex per trovare i RIDs dei record che soddisfano la condizione
CD
Costo per accedere alle pagine dei dati (I records nella RID list)
Sf(A = v) =
Sf(A = B) =
(A)
1
1
(A)
, invece se
(I)
(I)
Se lindice unclustered necessario calcolare una stima del numero di records Erec che soddisfano la
query. Per una semplice condizione A = v, Erec equivale alla lunghezza media della rid-list:
Erec =
(R)
(I)
La funzione (k,n) detta Cardenas formula ed una stima del numero di pagine (in un file di n pagine)
che contengno almeno un odei k rcords da recuperare usando la rid-list ordinata.
La funzione si approssima come:
1
(k,n) = (1 (1 ) )
n
Se lindice clustered
CD =
1
(I)
x Npag(R) =
(R)
(I)
Range Search
Operazione di ricerca per una condizione v1 <= A <= v2
Sf(v1 <= A <= v2) =
Sf(A > c) =
Sf(A < c) =
2 1
Si approssima a 1/4
max()min(A)
max(A) c
Si approssima a 1/3
max()min(A)
c min(A)
Si approssima a 1/3
max()min(A)
2 1
Si approssima a 1/4
max()min(A)
Mentre NoPageAccessesForRidList dipende dal fatto che I dati siano ordinate o meno sullindice, quindi sul
fatto che lindice sia clustered o unclustered
Quindi il costo CD si approssima come
Se lindice unclustered
CD = [ Sf() x Nkey(I) ] x [(
Dove
(R)
, Npag(R)) ]
(I)
Se lindice clustered
CD = [ Sf() x Nkey(I) ] x [
1
(I)
= Sf() x Npag(R)
x Npag(R) ]
Undo-Redo algorithms
Si dice che un algoritmo di recovery richiede un undo se un update di qualche transazione non terminata
(uncommitted) salvato nel db. Se avviene un failure, il recovery algorithm deve rifare gli update copiando
limmagine del database dal log del db.
Un algoritmo di recovery richiede un redo se una transazione terminata (committed) prima che tutti i suoi
updates vengano salvati nel db. Se avviene un system failure dopo che la transazione termini ma prima che
gli updates vengano salvati nel database, il recovery algoritm deve fare il redo degli updates copiando
limmagine dopo la transazione dal log del db.
Checkpoint
Quando parte una procedure di checkpoint:
In caso di un system failure, per recuperare il db bisogna invocare loperatore di restart (warm restart):
Fase di rollforward : In questa fase si legge il log dallinizio alla fine dal primo record dopo il checkpoint per
rifare tutte le oprazioni della transazione Ti terminata con successo, dove Ti appartiene a Lr. Quando un
record del tipo (commit, Ti ), Ti rimosso da Lr e questa fase termina quando Lr vuoto.
Relational Operators
Ogni relazione ha attributi senza valori null, e sono salvati in un file heap con una organizzazione primaria
index sequential. Vengono usati indici su uno o pi attributi. Gli indici sono organizzati come B+-Tree e
quelli per attributi non-key sono inverted indexes, con liste RID ordinate. Distinguiamo inoltre tra:
Clustered Index: Index costruito su uno o pi attributi di una relazione, ordinati sullindex key.
Accedere ai dati con una scansione delle foglie del non richiede accessi ripetuti alla stessa pagina
della relazione. Una relazione pu avere solo un clustered index.
Unclustered index: Costruito su uno o pi attributi che non sono usati per ordinare la relazione.
Accedere ai dati con una scan delle fogli del B+-Tree pu causare accessi casuali alle pagine della
relazione, che possono essere visitate pi di una volta.
Il costo stimato C per eseguire un physical operator il numero di pagine rette o scritte in permanent
memory per produrre il risultato. In genere:
C = CI + CD
Dove CI il costo per accedere alle index pages pe rtrovare i RIDs dei record che soddisfano la condizione.
CD il costo per accedere alle data pages che contengono i records. Se vengono usati gli index il costo CI
solitamente approssimato al costo per accedere alle foglie.
Physical Operators
SCAN
In tutti i casi, essendo una scan della tabella
Erec = Nrec(R)
TableScan(R)
SortScan(R, {A})
Restituisce i record di R ordinati secondo lattributo A. Lordinamento fatto con un merge sort. Il
costo dipende dal valore Npag(R), dal numero di pagine B del buffer e dallimplementazione del
mergesort.
Il costo del SortScan :
o C = Npag(R)
Se Npag(R) < B
o C = 3 x Npag(R)
Se Npag(R) <= B x (B-1)
o C = Npag(R) + 2 x Npag(R) x logB-1 (Npag(R) / b)
altrimenti
In genere si assume che Npag(R) <= B x (B-1)
IndexScan(R, I)
C = Nleaf(I) + [ Nkey(I) x (
()
()
, Npag(R) ]
IndexSequentialScan(R, I)
PROJECTION
Project(O, {A})
IndexOnlyScan(R, I, {A})
Restituisce i record ordinati sulla proiezioni senza duplicati dei records sullattributo A. Usabile solo
se gli attributi A da proiettare fanno parte dellindice I (o se gli attributi da proiettare hanno come
prefissi A)
Il costo :
o C = Nleaf(I)
La cardinalit del risultato
o Erec = Nrec(R)
Erec = Nkey(Ai)
Erec = min(Erec (O)/2, Nkey(Ai))
valori distinti
Distinct(O)
I records di O DEVONO essere ordinati, cos che i duplicati siano affianco. Loperatore restituisce i
records di O ordinati senza duplicati
Il costo :
o C = C(O)
HashDistinct(O)
Non richiede un input ordinato, ma equivale a fare un sort + distinct e restituisce i records NON
ordinati
Il costo :
o C = C(O) + 2 x Npag(O)
SORTING
Sort(O, {Ai})
SELECTION
Eccetto per Filter, la cardinalit :
Erec = Sf() x Nrec(R)
Filter(O,)
IndexFilter(R, I, )
Restituisce i record di R che soddisfano la condizione con luso dellindex I, definito sugli attributi
di . Usabile SOLO se una condizione sugli attributi dellindice I. Dato che ha come input la
tabella R, pu essere usato SOLO come foglia di un physical plan.
C = CI + CD
Ci = Sf() x Nleaf(I)
CD = Sf() x Npag(R)
Se I clustered
()
()
, Npag(R) ]
IndexSequentialFilter(R, I, )
IndexOnlyFilter(R, I, {Ai}, )
Operatore che esegue anche la proiezione sugli attributi {Ai} , usare solo se una condizione sugli
attributi I. I risultati sono ordinati. Se {Ai} include una key, i risultati sono senza duplicati
Il costo :
o C = Sf() x Nleaf(I)
Costo C = CI + CD
Dove CI = =1
GROUPING
La cardinalit la stessa del caso del distinct:
Erec = Nkey(Ai)
Erec = min(Erec (O)/2, Nkey(Ai))
valori distinti
Per essere usato irecord devono essere ordinati sugli attributi {Ai}, cos che i record di ogni gruppo
siano affianco. Restituisce i record ordinati su {Ai}
Il costo :
o C = C(O)
JOIN
La cardinalit in tutti I casi :
Erec = Sf(j) x Erec(OE) x Erec(OI)
NestedLoop(OE, OI, j)
PageNestedLoop(OE, OI, j)
Meglio del nestedLoop in quanto si considerano le NpagOE anzi che Nrec OE , il risultato del join non
ordinato
Conviene che allesterno ci sia una relazione con il minor numero di pagine
Il costo :
o CPNL = C(OE) + Npag(OE) x C(Oi)
Se gli operandi sono table scan
o CPNL = Npag(R) + Npag(R) x Npag(S)
o CPNL = Npag(S) + Npag(S) x Npag(R)
Conviene quindi che loperando esterno sia quello con MENO pagine
Conviene rispetto al NestedLoop in quanto Npag(R) < Nrec(R), ma produce risultati non ordinati
BlockNestedLoop(OE, OI, j)
Il costo
o
CBNL = Npag(R) + [
()
] x Npag(S)
Dove B la dimensione del buffer, se B riesce a contenere una delle due relazioni il costo si
riduce a Npag(R) + Npag(S)
IndexNestedLoop(OE, OI, j)
MergeJoin(OE, OI, j)
HashJoin(OE, OI, j)
Query Optimization
DISTINCT Elimination
Sia A linsieme degli attributi proiettati dalla query. Se A+ contiene la key di OGNI tabella usata nella query,
allora il distinct inutile. Se nella query c un GroupBy, allora affinch il distinct sia inutile A+ deve
contenere i grouping attributes.
Per il calcolo di A+ (Closure di A):
Aggiungere ad A+ tutti gli attributi X tali che nel Where della query appaia X = c dove c una costante.
Aggiungere anche tutti gli attributi Y tali che, se Z un sottoinsieme di A+ e Z = Y nel Where. Infine se Z
una key di una tabella, aggiungere a A+ tutti gli attributi di quella tabella.
In pratica si aggiungono alla closure di A tutti gli attributi che posso ottenere partendo dagli attributi
presenti nel Where.
GROUP BY Elimination
Il Group By inutile se ogni gruppo risultante ha 1 solo record o se c un solo gruppo
WHERE - SUBQUERY Elimination
Nel caso di query con Exists e subquery semplice (Tipo SELECT FROM WHERE) si pu rimuovere la
subquery portando allesterno le condizioni del where della subquery e aggiungendo un distinct.
Esempio:
diventa
In genere per fare il view merging si sostituisce il logical plan della view e lo si inserisce nella quey
(solitamente con un join)
PRE-GROUPING
In alcuni casi possibile eseguire il GroupBy prima del join:
In pratica si aggiungono ai grouping attributes gli attributi della condizione Cj del join e si rimuovono gli
attributi della relazione esterna del join. Dopo il join si proiettano i grouping attributes originali insieme ad
eventuali funzioni aggregate . Tutto questo si pu fare SOLO se X -> fk (La foreign key della relazione interna
determinata dai grouping attributes) e se le funzioni F usano solo attributi di R.