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