PROGETTAZIONE
FISICA
IL CATALOGO DI SISTEMA
Le tabelle di catalogo
!
Un DBMS memorizza su tabelle di catalogo le
informazioni su
!
!
!
ciascuna tabella
! nome della tabella e struttura del file
! nome e tipo di ciascun attributo
! nome di ciascun indice
! vincoli di integrità
ciascun indice
! nome e struttura
! attributi della chiave di ricerca
ciascuna vista
! nome e definizione
Giorgio Giacinto 2010
Database
3
Altre informazioni presenti nel
catalogo
!
!
!
!
!
!
!
Cardinalità delle tabelle
Dimensione delle tabelle
Cardinalità degli indici
Dimensione degli indici
Altezza degli indici
Ampiezza dell’indice
Informazioni sulle autorizzazioni e sugli
accessi degli utenti
Giorgio Giacinto 2010
Database
4
LA PROGETTAZIONE FISICA
Introduzione
!
!
!
Dopo il progetto ER, la traduzione in relazionale, il
raffinamento dello schema e la definizione delle
viste, abbiamo gli schemi logico ed esterno della
nostra base di dati.
Il passo successivo consiste nella scelta degli indici,
nel prendere decisioni sul clustering, e nel
raffinamento degli schemi logico ed esterno (se
necessario) per raggiungere le prestazioni
desiderate
I DBMS mettono a disposizione strumenti per la
verifica delle prestazioni
Giorgio Giacinto 2010
Database
6
Descrizione del carico di
lavoro
!
Lista di interrogazioni
!
!
!
Con la relativa frequenza di utilizzo
Lista di aggiornamenti e relativa frequenza
Obiettivi di prestazioni per ciascun tipo di
interrogazione e aggiornamento
Giorgio Giacinto 2010
Database
7
Comprendere il carico di
lavoro
!
Per ciascuna interrogazione nel carico di lavoro
!
!
!
!
A quali relazioni accede?
Quali attributi vengono restituiti?
Quali attributi sono coinvolti nelle condizioni di
selezione/join? Quanto selettive sono, probabilmente, tali
condizioni?
Per ciascun aggiornamento nel carico di lavoro
!
!
Quali attributi sono coinvolti nelle condizioni di
selezione/join? Quanto selettive sono, probabilmente, tali
condizioni?
Il tipo di aggiornamento (INSERT/DELETE/UPDATE) e gli
attributi che vengono modificati
Giorgio Giacinto 2010
Database
8
Progettazione fisica
!
Scelta degli indici
!
Ottimizzazione dello schema logico
!
Ottimizzazione di interrogazioni e transazioni
Giorgio Giacinto 2010
Database
SCELTA DEGLI INDICI
9
Scelta degli indici
!
Quali indici dovremmo creare?
!
!
Quali relazioni dovrebbero avere indici? Quali
campi dovrebbero costituire la chiave di ricerca?
Dovremmo creare più di un indice?
Per ciascun indice, che tipo di indice
dovremmo usare?
!
Clustered? Hash/B+?
Giorgio Giacinto 2010
Database
11
Scelta degli indici (segue)
!
Un approccio
!
!
!
Considerare a turno le interrogazioni più importanti.
Considerare il miglior piano di esecuzione usando gli indici
correnti. Verificare la possibilità di un piano migliore con un
indice aggiuntivo.
Prima di creare un indice, dobbiamo considerare
l’impatto sugli aggiornamenti nel carico di lavoro
!
Compromesso: gli indici possono velocizzare le
interrogazioni, rallentare gli aggiornamenti… ma anche
richiedere spazio su disco
Giorgio Giacinto 2010
Database
12
Linee guida per la selezione degli indici
Quando indicizzare
!
Non costruire indici a meno che certe
interrogazioni non ne traggano beneficio
!
Possibilmente scegliere indici che velocizzino
più di una interrogazione
Giorgio Giacinto 2010
Database
13
Linee guida per la selezione degli indici
Scelta della chiave di ricerca
!
Gli attributi nella clausola WHERE sono
candidati come chiavi dell’indice
!
!
Condizione di selezione di uguaglianza
suggerisce l’uso di indice sugli attributi coinvolti
(idealmente: hash)
Condizione di selezione di intervallo suggerisce
indice B+
Giorgio Giacinto 2010
Database
14
Linee guida per la selezione degli indici
Chiavi di ricerca con attributi multipli
!
!
Una clausola WHERE include condizioni su
più di un attributo di una relazione
oppure
L’uso di chiavi di ricerca con attributi multipli
consente l’uso di strategie di valutazione
basate solo sull’indice
Giorgio Giacinto 2010
Database
15
Linee guida per la selezione degli indici
Quando usare i cluster
!
L’uso del cluster favorisce principalmente le
interrogazioni per intervallo
!
Se per velocizzare una interrogazione è
sufficiente l’indice, non serve usare cluster
Giorgio Giacinto 2010
Database
16
Linee guida per la selezione degli indici
Indici hash o indici B+?
!
!
Un indice a albero B+ è in genere preferibile
perché supporta sia ricerche per uguaglianza
che per intervallo
L’indice hash è preferibile quando
!
!
Ci sono interrogazioni annidate e l’indice è sulla
relazione nella interrogazione interna
Non ci sono interrogazioni per intervallo che
coinvolgono l’indice
Giorgio Giacinto 2010
Database
17
Linee guida per la selezione degli indici
Costo di manutenzione degli indici
!
!
Gli indici possono rallentare le operazioni di
aggiornamento…
…ma possono anche velocizzarle (nel caso
di indici primari)
Giorgio Giacinto 2010
Database
18
ESEMPI DI SELEZIONE
DEGLI INDICI
Selezione per uguaglianza
SELECT I.inome, R.mgr
FROM Impiegati I, Reparti R
WHERE R.rnome = ‘Giocattoli’ AND I.rnum = R.rnum
!
! inome
Un possibile piano
!"
rnum=rnum
!
In base alle linee guida,
indici hash
!
un indice su rnome e un
indice su I.rnum
Giorgio Giacinto 2010
! rnome='Giocattoli '
Impiegato
Reparto
Database
20
Selezione per uguaglianza (segue)
!
Se nella clausola WHERE ci fosse anche la condizione
I.età=25
un buon piano eseguirebbe
!
!
!
!
una selezione su rnome
una selezione su età
il join dei due risultati
In questo caso servirebbero due indici
!
!
su rnome
su età
e l’indice su rnum nella tabella Impiegati non è utile
Giorgio Giacinto 2010
Database
21
Selezione per intervallo
SELECT I.inome, R.mgr
FROM Impiegati I, Reparti R
WHERE I.sal BETWEEN 10000 AND 20000
AND I.hobby = ‘Francobolli’ §
AND I.rnum = R.rnum
!
Indice hash su hobby e B+ su sal
!
!
Se la condizione di uguaglianza è selettiva,
possiamo usare solo l’indice su hobby
Se sono disponibili i due indici, l’ottimizzatore può
valutare quale indice è più selettivo
Giorgio Giacinto 2010
Database
22
Indici che permettono piani
basati solo sugli indici
SELECT R.mgr
FROM Impiegati I, Reparti R
WHERE I.rnum = R.rnum
!
Non viene mostrato alcun campo di Impiegati
!
è sufficiente usare un indice su rnum di Impiegati e non
accedere alla tabella
SELECT R.mgr, I.iID
FROM Impiegati I, Reparti R
WHERE I.rnum = R.rnum
!
Un indice B+ su (rnum,iID) consente di ottenere le
data entry senza accedere alla tabella
Giorgio Giacinto 2010
Database
OTTIMIZZAZIONE DELLA
BASE DI DATI
23
Necessità dell’ottimizzazione
!
!
L’uso della base di dati consente di valutare
meglio il carico di lavoro rispetto ai dati usati
in fase progettuale
E’ possibile migliorare le prestazioni
!
!
!
Ottimizzando gli indici
Ottimizzando lo schema logico
Ottimizzando le interrogazioni
Giorgio Giacinto 2010
Database
25
Ottimizzazione degli indici
!
Il carico di lavoro osservato può mettere in
evidenza, rispetto alla fase di progetto
!
!
!
Alcune interrogazioni e aggiornamenti ritenuti
frequenti, in realtà non lo sono
Altre interrogazioni o aggiornamenti sono
importanti
Aggiunta/eliminazione di indici
Giorgio Giacinto 2010
Database
26
Raffinare lo schema logico
!
La scelta dello schema logico dovrebbe
essere guidata dal carico di lavoro, oltre che
da considerazioni sulla ridondanza
!
Quando le modifiche sono fatte dopo che una
base di dati è in uso si parla di evoluzione
dello schema
!
Alcune di queste modifiche possono essere
“nascoste” alle applicazioni definendo delle viste
Giorgio Giacinto 2010
Database
27
Schemi di esempio
Contratti(cid, fid, gid, did, pid, qta, val)
Dep(did, budget, report)
Fornitori(fid, indirizzo)
Pezzi(pid, costo)
Progetti(gid, mgr)
!
Ci concentreremo su Contratti, denotata come
CFGDPQV. Sono dati i seguenti VI: GP → C, FD → P,
C è la chiave primaria
!
!
Quali sono le chiavi candidate per CFGDPQV?
In quale forma normale si trova questo schema di relazione?
Giorgio Giacinto 2010
Database
28
Decidere per la 3NF o per la
BCNF
!
CFGDPQV può essere decomposta in FDP e
CFGDQV, ed entrambe le relazioni sono in BCNF
!
!
!
Supponiamo che sia molto importante
!
!
Decomposizione senza perdita, ma che non conserva le
dipendenze
L’aggiunta di CGP permette di conservare le dipendenze
Trovare il numero di copie Q di pezzi P ordinati nel contratto
C
Richiede un join sullo schema decomposto, ma si può
rispondere tramite una scansione della relazione
originale CFGDPQV
Può indurci a decidere per lo schema 3NF CFGDPQV
Giorgio Giacinto 2010
Database
29
Denormalizzazione
!
Supponiamo che la seguente interrogazione sia
importante
!
!
Per velocizzare questa interrogazione, potremmo
aggiungere un campo budget B a Contratti
!
!
!
il valore di un contratto è minore del budget del
dipartimento?
Questo introduce la DF D → B rispetto a Contratti
Contratti non è più in 3NF
Potremmo scegliere di apportare questa modifica se
l’interrogazione è importante, e non possiamo
ottenere prestazioni adeguate in altro modo
!
ad es., aggiungendo indici o scegliendo uno schema 3NF
alternativo
Giorgio Giacinto 2010
Database
30
Scelta delle decomposizioni
Ci sono 2 modi per decomporre CFGDPQV
!
1.
2.
FDP e CFGDQV: senza perdite ma non conserva le
dipendenze
FDP, CFGDQV e CGP: conserva anche le dipendenze
La differenza è il costo del mantenimento della DF
GP → C
!
!
!
2. decomposizione: indice su GP nella relazione CGP
1. decomposizione: richiede una asserzione
CREATE ASSERTION ControllaDip
CHECK (NOT EXISTS (SELECT *
FROM PezzoInfo P, ContrattoInfo C
WHERE P.fid = C.fid AND P.did = C.did
GROUP BY C.gid, P.pid
HAVING COUNT(C.cid) > 1))
Giorgio Giacinto 2010
Database
31
Scelta delle decomposizioni
(segue)
!
Valgono i seguenti VI
GP → C, FD → P, C è la chiave primaria
!
!
Supponiamo inoltre che FPQ → V
Se decidiamo di voler decomporre CFGDPQV in
BCNF, abbiamo ora una terza scelta
!
!
!
!
Decomponiamo in FPQV e CFGDPQ
Poi decomponiamo CFGDPQ in FDP, CFGDQ
Otteniamo la decomposizione senza perdita: FPQV, FDP,
CFGDQ
Per conservare GP → C, possiamo aggiungere CGP
Scelta: {FPQV, FDP, CFGDQ} oppure
{FDP,CFGDQV}?
Giorgio Giacinto 2010
Database
32
Decomposizione verticale di
una relazione BCNF
!
!
Supponiamo di scegliere {FDP, CFGDQV}
Questa è in BCNF, e non c’è ragione di decomporre
ulteriormente
Però, supponiamo che queste interrogazioni siano
importanti
!
!
!
!
Trovare i contratti con il fornitore F
Trovare i contratti che coinvolgono il dipartimento D
Decomporre ulteriormente CFGDQV in CF, CD e
CGQV potrebbe velocizzare queste interrogazioni.
D’altra parte, la seguente interrogazione è più lenta
!
Trovare il valore totale di tutti i contratti con il fornitore F
Giorgio Giacinto 2010
Database
33
Decomposizioni orizzontali
!
Definizione usuale di decomposizione
!
!
Una relazione è sostituita con una collezione di relazioni
che sono proiezioni. Caso più importante.
A volte, potremmo voler sostituire la relazione con
una collezione di relazioni che sono selezioni
(decomposizione orizzontale)
!
!
Ciascuna nuova relazione ha lo stesso schema
dell’originale, ma un sottoinsieme delle righe
Collettivamente, le nuove relazioni contengono tutte le
righe dell’originale. Tipicamente, le nuove relazioni sono
disgiunte
Giorgio Giacinto 2010
Database
34
Decomposizioni orizzontali
(segue)
!
Supponiamo che tutti i contratti con valore > 10.000 siano
soggetti a regole diverse.
!
!
!
Ciò significa che le interrogazioni su Contratti spesso
conterranno la condizione val > 10.000
Possiamo gestire questa situazione con un indice ad albero
B+ clustered sul campo val di Contratti
Un secondo approccio consiste nel sostituire i contratti con
due nuove relazioni: ContrattiGrandi e ContrattiPiccoli, con
gli stessi attributi (CFGDPQV)
! Si comporta come un indice su tali interrogazioni, ma senza
il sovraccarico degli indici
! Si possono inoltre costruire indici clustered su altri attributi!
Giorgio Giacinto 2010
Database
35
Mascherare i cambiamenti dello
schema logico
CREATE VIEW Contratti(cid, fid, gid, did, pid, qta, val)
AS SELECT *
FROM ContrattiGrandi
UNION
SELECT *
FROM ContrattiPiccoli
!
!
La sostituzione di Contratti con ContrattiGrandi e
ContrattiPiccoli può essere mascherata dalla vista
Però le interrogazioni con la condizione val > 10000
devono essere effettuate su ContrattiGrandi per una
esecuzione efficiente
!
gli utenti interessati alle prestazioni devono essere consapevoli
del cambiamento
Giorgio Giacinto 2010
Database
36
Ottimizzazione delle
interrogazioni
Minimizzare l’uso di DISTINCT: non ce n’è bisogno se
i duplicati sono accettabili, o se la risposta contiene
una chiave
Minimizzare l’uso di GROUP BY e HAVING
!
!
SELECT MIN(I.età)
FROM Impiegati I
GROUP BY I.rnum
HAVING I.rnum = 102
Giorgio Giacinto 2010
SELECT MIN(I.età)
FROM Impiegati I
WHERE I.rnum = 102
Database
37
Altre linee guida per il
raffinamento delle interrogazioni
(segue)
!
Evitare l’uso di relazioni intermedie
SELECT * INTO Temp
FROM Imp I, Rep R
WHERE I.rnum = R.rnum
AND R.nomemgr = “Joe”
e
SELECT T.rnum, AVG(T.sal)
FROM Temp T
GROUP BY T.rnum
!
!
contro
SELECT I.rnum, AVG(I.sal)
FROM ImpI, Rep R
WHERE I.rnum = R.rnum
AND D.nomemgr =
“Joe”
GROUP BY E.rnum
Non materializza la relazione intermedia Temp
Se c’è un indice ad albero B+ denso su <rnum, sal>,
si può usare un piano basato solo sull’indice
Giorgio Giacinto 2010
Database
38