Indici
Indici, motivazioni
Quando viene effettuata una query in una tabella,
come opera il DBMS per dare la risposta?
In generale fa una ricerca sequenziale.
ESEMPIO:
Categorievetture
Select *
FROM Categorievetture
Where targa= L23843K
Viene esaminata ogni riga
prima di trovare quella
desiderata. Comporta un
numero di confronti
dell’ordine del numero di righe
Targa
Categoria
Nome_cat
A24353Q
01
Autovettura
F63457T
03
Motociclo
D2343GH
01
Autovettura
T94756U
02
Rimorchio
W34985U
02
Rimorchio
L23843K
01
Furgone
Indici, motivazioni
Analogamente una join basata su una coppia di
attributi di due tabelle, in mancanza di un indice su
uno o entrambi gli attributi comporta una verifica su
tutte le possibili coppie coinvolte nella condizione di
join.
Categorie
Veicoli
Targa
Categoria
Cod_cat
Nome_cat
A24353Q
01
F63457T
03
01
Autovettura
D2343GH
01
02
Rimorchio
T94756U
02
03
Motociclo
W34985U
02
04
Furgone
L23843K
01
Ogni valore di categoria viene
confrontato con ogni valore di
cod_cat per vedere se
soddisfa la condizione.
Comporta un numero di
operazioni uguale al prodotto
dei numeri di righe delle due
tabelle
SELECT targa, Veicoli.categoria, nome_cat
FROM Categorie, Veicoli
WHERE Veicoli.Categoria =Categorie.cod_cat
Targa
Categoria
Nome_cat
A24353Q
01
Autovettura
F63457T
03
Motociclo
D2343GH
01
Autovettura
T94756U
02
Rimorchio
W34985U
02
Rimorchio
L23843K
01
Furgone
Uso degli Indici
Questo è vero a meno che non si definisca un indice
sulla colonna Targa.
Un indice è una struttura dati che se è definita su un
attributo di una data tabella, permette l’accesso
diretto ai dati specifici contenuti nella colonna quando
l’interrogazione è basata su quell’attributo.
E’ conveniente quindi utilizzare degli indici su una
colonna di una tabella quando prevediamo che si
faranno molte query basate su quella colonna, o se
quella colonna sarà coinvolta in molte operazioni di join.
Indici, definizione
In generale un indice è un elenco di parole chiave
accompagnate dalla posizione in cui quella parola chiave
appare in un file.
Si pensi all’indice analitico di un libro. Le parole chiave
sono elencate in ordine alfabetico, e a fianco c’è l’elenco
delle pagine in cui la parola chiave appare nel libro. La
ricerca alfabetica è relativamente facile (o poco
complessa) e una volta trovata la parola chiave
nell’indice, è facile trovare le pagine di riferimento.
Indici, svantaggi
Il grande vantaggio degli indici sta quindi nella rapidità
delle ricerche.
Tuttavia non conviene definire un indice su ogni
colonna. Infatti un indice occupa spazio di memoria,
per cui non è opportuno utilizzarli, a meno che la
colonna considerata non sia coinvolta spesso in
interrogazioni.
In particolare gli indici vengono memorizzati nel disco
Gestione della memoria
In generale le moderne piattaforme di calcolo contengono
una gerarchia di livelli di memoria, ciascuna col proprio
costo e le proprie caratteristiche prestazionali. Si passa
quindi da memorie veloci, costose e con piccola capacità
(CPU) a memorie lente, poco costose e grandi (Hard Disk).
B=32byte
B=64 byte
B=8 kilobyte
CPU
Cache di
livello 1
Cache
di
livello 2
Memoria
centrale
Disco
Registri
32-64
kilobyte
1-4
Megabyte
256-512 Megabyte
10 Gigabyte
10 Terabyte
Modello di memoria esterna
In generale il modello della macchina a registri è stato
esteso, ammettendo l’uso di una memoria esterna.
Questo modello è basato sulle seguenti ipotesi:
1. La memoria esterna ha dimensione illimitata;
2. La memoria interna ha dimensione finita M
3. I dati sono trasferiti dalla memoria esterna a quella
interna (e viceversa) in blocchi di dimensione B. Si
assume B<M/2
Per avere buone prestazioni in questo modello gli
algoritmi devono minimizzare il numero di accessi alla
memoria esterna
CPU-Memoria
Nell’architettura VonNeuman il canale di comunicazione
tra la CPU e la memoria è il punto critico (collo di
bottiglia) del sistema.
• La tecnologia consente di realizzare CPU sempre più
veloci
• Il tempo di accesso delle memorie non cresce così
rapidamente
Criteri di Gestione
• I dati utilizzati più spesso vanno posti in memorie
facilmente accessibili.
• I dati utilizzati più raramente sono posti in memorie
con tempi di accesso elevato.
• Allocazione dinamica per utilizzare gli spazi disponibili
con la massima efficienza.
• Spostamento automatico dei dati tra i livelli.
• Canali di comunicazione veloci fra i livelli. La politica
di gestione mira ad offrire una memoria che abbia:
• i tempi di accesso della più veloce,
• le dimensioni della maggiore,
• i costi della più economica.
Memorizzazione di un Indice –
B-trees
Generalmente gli indici più comuni di un database sono
memorizzati in B-tree, dove la B sta per (?):
• Balanced tree
• Bayer, inventore insieme a McCreight
• Boeing, la compagnia per la quale gli autori lavoravano
Esistono molte varianti, tra cui il B-tree “vero e proprio”, il
B*- tree e il B+-tree.
Un B-tree è un albero (direzionato) a più vie perfettamente
bilanciato organizzato a nodi, che corrispondono a blocchi di
Disco.
B-Tree, definizione
Siano g, h > 0 due numeri naturali, detti rispettivamente
ordine e altezza del B-tree. Un B-tree T della classe
T(g,h) ha le seguenti proprietà:
1. Ogni cammino dalla radice a una foglia ha sempre la
stessa lunghezza h, chiamata altezza del B-tree (h =
numero nodi nel cammino).
2. Ogni nodo, a eccezione della radice e delle foglie, ha
almeno g+1 figli. La radice o è una foglia (h = 1) o ha
almeno 2 figli.
3. Ogni nodo ha al più 2g+1 figli.
B-Tree, informazione nei nodi
1. Ogni nodo memorizza tra g e 2g chiavi, eccetto la
radice che può avere da 1 a 2g chiavi.
2. Un nodo interno (non foglia) con l chiavi (g ≤ l ≤ 2g) ha
l+1 puntatori ad altrettanti nodi figli.
3. In ogni nodo le chiavi ki sono memorizzate in ordine
crescente.
k1<k2<…<kl
4. Le chiavi di tutti i nodi del primo sottoalbero sono
tutte minori di k1.
Le chiavi di tutti i nodi dell’i-esimo sottoalbero sono
comprese tra ki e ki+1.
Le chiavi di tutti i nodi dell’ultimo sottoalbero sono
maggiori di kl.
Esempio
B-tree di grado 3
P
T X
C G M
A B
D E F
J K L
N O
Q R S
U V
Y Z
Valori ripetuti
N.B. Nel caso di indice su valori ripetuti, il formato del
nodo deve essere adattato per consentire di
memorizzare anche il grado di molteplicità di ki e la
lista di puntatori a record con valore di chiave ki.
Proprietà
Ogni B-tree di altezza h con n nodi soddisfa
H<= logg(n+1)/2
E’ quindi facile rendersi conto che una ricerca in un
B-tree si risolve in tempo logaritmico.
Si può anche dimostrare che ogni inserimento e
cancellazione di nodi si effettua in tempo logaritmico
Indici Bitmap
Gli indici bitmap sono una diversa struttura dati che
implementa gli indici. Essi risultano più efficienti quando
l’indice si definisce su attributi che assumono un numero
relativamente piccolo di valori (esempio sesso M/F,
valutazione 1/2/3/4/5 etc.).
In questo caso l’indice su un attributo di una tabella è a
sua volta una tabella con un numero di colonne uguale al
numero di valori che l’attributo può assumere, e in
ciascuna riga (corrispondenti alle righe della tabella a cui
l’indice e’ riferito), c’è un 1 in corrispondenza della colonna
il cui nome è uguale al valore che il dato assume sulla
tabella indicizzata
Esempio
Un indice bitmap sulla colonna categoria della
seguente tabella i cui valori possono essere solo 01,
02, 03:
01 02 03
Targa
Categoria
A24353Q
01
1
0
0
F63457T
03
0
0
1
D2343GH
01
1
0
0
T94756U
02
0
1
0
W34985U
02
0
1
0
L23843K
01
1
0
0
U59054M
01
1
0
0
R29064Z
03
0
0
1
Create Index
In generale è possibile creare un indice su una colonna
mediante la seguente sintassi:
CREATE [bitmap/unique] INDEX nome_indice
ON Tabella(colonna [, colonna2…])
Dove Tabella e colonna sono rispettivamente la tabella
e la colonna su cui si vuole costruire l’indice.
bitmap/unique sono due particolari modalità in cui si
possono costruire gli indici. In mancanza di questa
specifica, si tratta di un indice generico
Creazione degli indici unici
In Oracle un indice unico può essere creato in tre
modi:
• Automaticamente quando si definisce una chiave
primaria
• Automaticamente quando si definisce una colonna
unique
• Manualmente mediante il comando Create Index con
la specifica unique
Chiave primaria
Quando si definisce una chiave primaria, Oracle
definisce automaticamente un indice su quella colonna.
La logica di quest’automatismo sta nel fatto che le chiavi
primarie più di ogni altro attributo sono coinvolte in
interrogazioni e join.
Analogamente viene definito automaticamente un indice
quando viene definito su una colonna un vincolo di
unicità.
In qualche modo l’indice serve anche a gestire il
controllo del vincolo di unicità
Esercizio
Nel Database campione costruire un indice sull’attributo
art_denominazione della tabella Articoli
Create Index ind_art on Articoli.art_denominazione
Nel Database campione costruire un indice bitmap
sull’attributo cat_cod della tabella Articoli
Create bitmap Index indice_cat
on Articoli.cat_cod
Sequenze
Sequenze
Con una sequenza è possibile assegnare numeri unici alle
colonne del database. La sintassi è
Create sequence nomesequenza
increment by n
start with m
In questo modo si costruisce una sequenza numerica
che inizia per m e che si incrementa ogni volta di n
Esempio
Create sequence IDCliente
increment by 1 start with 1000
Questo codice crea una sequenza cui si puo accedere
durante l’esecuzione di comandi insert ed update.
Per esempio
Insert into Cliente (nome, Contatto, ID)
Values(‘Cole Construction’, ‘Veronica’, IDCliente.Nextval)
Nextval
NextVal associato a IDCliente comunica a Oracle che si
desidera il prossimo numero disponibile della sequenza
ID Cliente
Se si vuole utilizzare più volte lo stesso valore (per
esempio per inserirlo in più tabelle correlate) si può
applicare CurrVal, in cui viene memorizzato l’ultimo
valore di nextval generato.
La volta successiva che nextval verrà utilizzato, Currval
assumerà lo stesso valore