Sei sulla pagina 1di 13

Permanent Memory e Buffer Manager

I file sono divisi in pagine (physical pages) numerate consecutivamente da 0.


o Quando una physical page trasferita in main memory chiamata semplicemente page
Ogni pagina contiene al suo interno dei records, costituiti a loro volta da attributi (o campi)
o Ogni record identificato nel database tramite un RID (record identifier) costituito dalla
coppia (Numero di pagina, Numero di slot)

Si dice che un file R ha:

Numero di records: Nrec(R)


o Ogni record ha lunghezza costante Lr
I record sono salvati in numero di pagine Npag(R)
o Di dimensione Dpag

Il numero di pagine totali si ottiene anche come:


Npag(R) = Nrec(R) x (Lr / Dpag)

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)

Npag(R) se non esiste

se la key esiste nel file

Range Search:

Npag(R) perch tutte le pagine devono essere lette

Sequential Organization
I records sono salvati in ordine sequenziale rispetto a una search-key
Equality search:

(R)

sia che la key esista sia che non esista

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.

Index Organization (B+-Trees)


Se la tabella salvata come una heap organization, definito un indice per ogni key, i cui elementi sono (k,
rid) dove k il valore per un record e rid lidentificatore del record.

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

Definiamo su una tabella R con una chiave K

Numero di record Nrec(R)


Numero di pagine Npag(R)
Numero di foglie dellindice su K Nleaf(Idx)

Range Search
Unclustered Index:
Sf() =

2 1
max min

Il costo della ricerca dato da:


Cs = Ci + CD
Dove Ci il costo di accesso allindice e CD il numero di records che soddisfano una data condizione. In
questo caso:
Ci = Sf() x Nleaf(Idx)
CD = Erec = Sf() x Nrec(R)

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)

Non-Key Attribute Organizations


Organizzazione sugli attributi, ovvero strutture che recuperano dati di una tabella che soddisfano una certa
query su attirubuti non chiave, ovvero attributi che non identificano univocamente un record.

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

K: Ovvero lattributo, con tutti i suoi valori possibili.


o Ad esempio in un tabella, un campo quantit pu avere diversi valori per ogni riga, nella
colonna k verranno elencati tutti i possibili valori che assume k
N: Ovvero il numero di records che hanno quel dato valore di k
o Nellesempio precedente, se ad esempio ci sono 4 righe con Quantit = 2 allora avr k =
quantit = 2 e n subito affianco con 4
K
n
2
4
RID List: Ovvero la lista dei RID dei records contenenti quel dato valore, di conseguenza, se ad
esempio n = 4 allora avr una RID list di lunghezza 4, con 4 RID differenti

Performance
Nrec(R)

Il numero di records di R

Npag(R)

Il numero di pagine occupate da R

LR

Numero di bytes utilizzati per rappresentare il valore di un singolo record

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)

Il numero di chiavi distinte nellindice I

Nleaf(I)

Il numero di foglie nellindice I

LRID

Il numero di bytes utilizzati per rappresentare il RID di un record

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) =

se invece non esiste un indice su A si approssima a 1/ 10

(A)
1

Se esiste un indice solo su A si approssima a

max( (A), (B)

1
(A)

, invece se

non esiste un indice si approssima a 1/10


Il costo CI si approssima solitamente al costo per accedere alle foglie
CI = Sf() x Nleaf(I) = 1/ Nkey(I) x Nleaf(I) =
=

(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

In genere si approssima come


(k,n) min(k,n)
Il costo CD si approssima invece come:
Se lindice unclustered
CD = (Erec, Npag(R)) min( Erec, Npag(R) )

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)

Sf(A < B) = 1/3


In generale Sf(1 v 2) = Sf(1) + Sf(2) - Sf(1) x Sf(2)
Il costo della ricerca sempre Cs = CI + CD
Il costo per acceder allindice stimato come il costo per visitare le foglie che contengono la rid-list:
CI = Sf() x Nleaf(I)
Dove Sf() il selectivity factor per la condizione v1 <= A <= v2
Sf() =

2 1

Si approssima a 1/4

max()min(A)

Il numero di accessi alla pagina CD stimato come:


CD = NoIndexKeyValues x NoPageAccessesForRidList
Dove

NoIndexKeyValues = Sf() x Nkey(I)

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)

Nrec(R) / Nkey(I) la lunghezza media delle rid-lists

Se lindice clustered
CD = [ Sf() x Nkey(I) ] x [

1
(I)

= Sf() x Npag(R)

x Npag(R) ]

Transaction and Recovery management


Le transazioni sono un gruppo di operazioni sul db che garantiscono che vengono eseguite tutte insieme in
modo atomico e che garantiscano un consistent state del database.
Una transazion e una sequenza di operazioni sul database e su dati temporanei che rispetta le seguenti
propriet:

Atomicity : Solo le transazione terminate normalmente (committed transactions) cambiano il


database. Se lesecuzione di una transazione interrotta a causa di un problema (aborted
transaction) lo stato del database deve rimanere immutato come se non fosse stata eseguita
nessuna operazione della transazione interrotta
Isolation: Quando una transazione eseguita in contemporanea con altre leffetto finale devessere
lo stesso come se fosse stata eseguita da sola
Durability: Leffetto di una transazione completata (committed) sul database permane anche a
eventuali problemi o failures, ovvero irrevocabile.

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:

Vengono sospese le attivazioni di nuove transazioni


Il sistema aspetta che terminano tutte le transazioni attive
Tutte le pagine presenti nel buffer che sono state modificate sono scritte in memoria permanente e
i record scritti nel log (flush operation)
Il CKP record scritto nel log
Un puntatore a CKP salvato in un file speciale chiamato restart file
Il sistema permette lattivazionedi nuove transazioni

Undo NoRedo Algorithm


Non si fa mai il redo di una transazione dopo un system failure. Viene scritta nel log solo la before-image.
Loperazione di restart efficiente.
NoUndo-Redo Algorithm
Non si fa mai lundo di una transazione
Undo-Redo Algorithm
Vengono rifatti sia gli undo che i redo delle transazioni.

Recovery from system and media failures

In caso di un system failure, per recuperare il db bisogna invocare loperatore di restart (warm restart):

Portare il db nello stato committed rispettando lesecuzione fino al failure


Ricominciare le normali operazioni di sistema

Fase di rollback, In questa fase si legge il log dalla fine allinizio:


1. Per fare lundo se necessario degli updates relativi alle transazioni NON terminate
2. Per trovare un insieme di identificatori di transazioni che sono terminate con successo cos da
rifare le loro operazioni.
In particolare si fanno le seguenti operazioni fino al primo checkpoint trovato, costruendo due insiemi
inizialmente vuoti:
Lr (insieme di transazioni che devono essere rifatte, to redo transactions)
Lu (insieme di transazioni che devono essere annullate, to undo transactions)

Se un record (commit, Ti), Ti aggiunto a Lr


Se un record lupdate di una transazione Ti , e se Ti non fa parte di Lr, loperazione annullata
(undone) e T aggiunto a Lu
Se un record (begin, Ti), Ti rimosso da Lu
Se un record (CKP, L), per ogni Ti che fa parte di L, se Ti non appartiene a Lr allora Ti aggiunto a Lu.
Se Lu non vuoto, la fase di rollback continua dopo il checkpoint fino ca che Lu non vuoto.

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)

Retituisce i records di R nellordine in cui sono salvate (unsorted)


Costo C = Npag(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)

Restituisce i records di R ordinati secondo gli attributi Ai dellindice I


Il costo dipende dal tipo di indice e dal tipo di attributo:
o C = Nleaf(I) + Npag(R)
se I clustered
o C = Nleaf(I) + Nrec(R)
se I su una key di R
o

C = Nleaf(I) + [ Nkey(I) x (

()
()

, Npag(R) ]

IndexSequentialScan(R, I)

Restituisce I records di R ordinate solo se la primary organization index sequantial su I. Ordinato


sulla primary key.
Il costo
o C = Nleaf(I)

PROJECTION
Project(O, {A})

Restituisce i records della proiezione dei records di O sullattributo A


Il costo :
o C = C(O)
La cardinalit del risultato data dalla cardinalit di O (nel physical plan data quindi della
cardinalit degli operatori che stanno sotto):
o Erec = Nrec(O)

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)

DUPLICATE ELIMINATION (DISTINCT)


La cardinalit del risultato stimata come:

Erec = Nkey(Ai)
Erec = min(Erec (O)/2, Nkey(Ai))
valori distinti

Se Ai il solo attributo di O, con Nkey(Ai) valori distinti


Se vi sono n attributi A1,....,An e ogni attributo ha Nkey(Ai)

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})

Utilizza il piped merge sort per ordinare i records di O


Il costo :
o C = C(O)
Se Npag(O) < B
o C = C(O) +2 x Npag(O)
Se Npag(O) <= B x (B-1)
o C = C(O) + 2 x Npag(O) x logB-1 (Npag(O) / B)
altrimenti
La cardinaliut :
o Erec = Nrec(O)

SELECTION
Eccetto per Filter, la cardinalit :
Erec = Sf() x Nrec(R)

In quanto agiscono su R (Filter invece agisce su O)

Filter(O,)

Restituisce i records di O che soddisfano la condizione


Il costo :
o C = C(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.

Il costo dato da:


Dove

C = CI + CD

Ci = Sf() x Nleaf(I)

Mentre CD dipende dal tipo di indice e dallattributo su cui definito:

CD = Sf() x Npag(R)

CD = NoListToVisit x NoPageToVisitForList = Sf() x Nkey(I) x [ (

Se I unclustered ed definito su unna non-key di R


CD = Sf() x Nrec(R)
Se I unclustered ed definito su una key di R

Se I clustered
()
()

, Npag(R) ]

IndexSequentialFilter(R, I, )

Da usare solo se una condizione su I. Restituisce i record ordinati di R


Il costo :
o C = Sf() x Nleaf(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)

OrIndexFilter(R, {Ii, i}) e AndIndexFilter(R, {Ii, i})

Usabile con condizioni 1 2 ..... n per lAnd


O per condizioni 1 v 2 v ..... v n per lOr
Dove i una condizione sullindice I

Costo C = CI + CD
Dove CI = =1

Ovvero la somma di tutti i CI

Mentre CD = (Erec, Npag(R))


Dove

Erec = Sf() x Nrec(R)

GROUPING
La cardinalit la stessa del caso del distinct:

Erec = Nkey(Ai)
Erec = min(Erec (O)/2, Nkey(Ai))
valori distinti

Se Ai il solo attributo di O, con Nkey(Ai) valori distinti


Se vi sono n attributi A1,....,An e ogni attributo ha Nkey(Ai)

GroupBy(O, {Ai}, {fi})

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)

HashGroupBy(O, {Ai}, {fi})

NON richiede linput ordinato ed anche il risultato NON ordinato


Il costo un p alto:
o C = C(O) + 2 x Npag(O)

JOIN
La cardinalit in tutti I casi :
Erec = Sf(j) x Erec(OE) x Erec(OI)
NestedLoop(OE, OI, j)

Si pu usare per qualsiasi condizione j


Conviene che loperatore esterno abbia un numero di record e di pagine inferiore a quello interno
Il risultato ordinato sugli attributi di OE
Il costo :
o CNL = C(OE) + Erec(OE) x C(Oi)

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)

Un miglioramento del PageNestedLoop

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)

Loperatore richiede che:


o Il join sia un equi-join (j = (OE.Ai = OI.Aj)
o La foglia delloperando interno sia un IndexFilter(S, I, j), con S una relazione e I un indice
sugli attributi del join Aj di S.
Il risultato ordinato sugli attributi di OE
Il costo :
o CINL = C(OE) + Erec(OE) x (CI + CD)
o Dove (CI + CD) il costo per recuperare i matching records di S con un record di OE, e
dipende dal tipo di index (clustered o no) e sul fatto che lattributo del join di S sia una
chiave o una Foreign key, fermo restando che la condizione sia in predicato di uguaglianza

MergeJoin(OE, OI, j)

Funziona solo se:


o Il join un equi-join (j = (OE.Ai = OI.Aj)
o I records di OE e OI sono ordinati sugli attributi del join OE.Ai e OI.Aj
o Nella condizione del join OI.Aj una chiave per OE (Foreign Key)
Il risultato ordinato sugli attributi di OE
Il costo :
o CMJ= C(OE) + C(OI)

HashJoin(OE, OI, j)

Il risultato non ordinato sui join attributes


Il costo quello del MergeJoin con laggiunta di un sorting:
o CMJ= C(OE) + C(OI) + Npag(OE) + Npag(OI)

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:

SELECT * FROM R WHERE EXISTS (SELECT * FROM T WHERE a = 3)

diventa

SELECT DISTINCT FROM R,T WHERE a = 3


VIEW merging
Un GroupBy pu essere portato sopra il join in questo modo:

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.

Potrebbero piacerti anche