Fondamenti di Informatica 2 Laboratorio di Basi di dati A.A. 2014-2015

Transcript

Fondamenti di Informatica 2 Laboratorio di Basi di dati A.A. 2014-2015
Fondamenti di Informatica 2
Laboratorio di Basi di dati
A.A. 2014−2015
Francesco Pistolesi
12 Marzo, 13 Marzo:
Database e modello logico relazionale. Tipi di linguaggi: dichiarativi e procedurali.
Livello di astrazione di un linguaggio dichiarativo. Introduzione al DBMS Oracle
MySQL. Architetture distribuite multi-tier: data tier; application tier; presentation
tier. Ruolo del data tier nel back-end. Apertura di una connection a MySQL server
dalla command line: comando mysql (opzioni -u, -p, -h, -P). Comandi show databases, use, show tables, explain. Querying di un database MySQL. Costrutto
SELECT-FROM-WHERE: sintassi, semantica e ordine di esecuzione. Proiezione di tutti
gli attributi. Operatori di confronto e connettivi logici AND e OR. Check di appartenenza a un range con BETWEEN. Gestione dei duplicati nella proiezione mediante
DISTINCT. Proiezioni esenti da duplicati. Il valore NULL e i suoi significati: valore
mancante o valore semanticamente definito. Condizioni sui valori NULL mediante
IS NULL e IS NOT NULL. Congiunzioni e disgiunzioni logiche che includono valori
NULL. Gestione delle date su MySQL. Tipi di dato DATE e TIMESTAMP. Cambio di
formattazione mediante la funzione DATE_FORMAT() e parametri: %Y, %y, %M, %m,
%d, %W, %w, %T. Formattazioni con concatenazione. Confronti fra date. Funzioni
DAY(), MONTH() e YEAR() e loro impiego nella proiezione e nelle condizioni. Variabile CURRENT_DATE. Durata di lassi di tempo mediante DATEDIFF() e PERIOD_DIFF().
Condizioni di durata e shift temporale: funzioni DATE_ADD() e DATE_SUB(). Uso di
INTERVAL. Somma e sottrazione dirette. Funzioni di utilità sulle date: DAYNAME(),
MONTHNAME(), DAYOFWEEK(), WEEKDAY(), LAST_DAY(), DAYOFYEAR(), WEEKOFYEAR(),
YEARWEEK(). Operatori di aggregazione. Funzionamento e processazione. Conteggio dei record di un result set mediante COUNT(*). Conteggio dei valori diversi su uno
o più attributi di un result set: operatore COUNT(DISTINCT Attributo). Conteggio
dei valori diversi su attributo nullable di un result set: operatore COUNT(Attributo).
Somma dei valori su un attributo: operatore SUM(). Media aritmetica dei valori
su un attributo: operatore AVG(). Calcolo del valore massimo e minimo assunto,
1
dai record di un result set, su un attributo: operatori MAX() e MIN(). Problema
dell’individuazione del record correlato al valore massimo/minimo su un attributo.
Esercizi.
26 Marzo, 27 Marzo:
Introduzione alle query su più tabelle. Theta join in MySQL e comando INNER JOIN.
Significato, impieghi e processazione. Equi-join sulla foreign key. Join naturale in
MySQL e comando NATURAL JOIN. Uso di DISTINCT nel join naturale, e semantica degli attributi omonimi. Comando USING per equi-join su sottoinsieme della foreign
key. Prodotto cartesiano in MySQL e comando CROSS JOIN. Significato e impieghi.
Join esterni in MySQL. Join esterno sinistro e join esterno destro. Comandi LEFT
OUTER JOIN e RIGHT OUTER JOIN. Significato e utilità del join esterno. Gestione dei
valori NULL nelle query con join esterni. Significato insiemistico di inner join, join
esterno sinistro e destro. Realizzazione dell’operazione di complemento mediante
join esterno clausola IS NULL. Processazione di una query con join e condizioni sui
record. Multi-table join in MySQL. Significato e impieghi. Considerazioni sulla cardinalità del result set. Ambiguità. Ridenominazione nella proiezione. Ridenominazione mediante alias nel FROM. Proiezione e selezione di attributi mediante la notazione puntata con alias. Self join. Significato e impieghi. Esempi di utilizzo del self
join in query contenenti condizioni temporali. Self outer join. Esempio di utilizzo
di self outer join per condizioni contenenti il concetto di esistenza. Considerazioni
sull’età di un individuo in un punto e in un segmento della retta temporale. Subquery. Significato, impieghi e motivi per cui sono state introdotte. Noncorrelated
subquery. Cosa sono e a cosa servono. Concetto di indipendenza dalla query esterna. Subquery con IN e con NOT IN. Processazione di una query con noncorrelated
subquery in MySQL. Considerazioni su complessità computazionale, prestazioni ed
efficienza delle subquery in MySQL. Perché e come il query optimizer riformula le
query con subquery. Annidamento multiplo. Visibilità degli alias e shadowing. Subquery scalari. Contesti in cui usare gli operatori di confronto, oppure IN e NOT IN.
Quando si usa ‘=’ e quando si usa IN. Risoluzione di una query che proietta il record
a cui è connesso il valore massimo di un attributo. Risoluzione mista subquery-join.
Equivalenza subquery-join e passaggio alla versione join-equivalente. Derived table.
Impieghi e utilità. Esercizi.
16 Aprile, 17 Aprile:
Correlated subquery. Significato e funzionamento. Alias di correlazione. Esempio di correlated subquery nel WHERE. Correlated subquery di tipo EXISTS (e NOT
EXISTS). Proiezione standard e proiezione efficiente. Funzionamento di una correlated subquery di tipo EXISTS. Considerazioni sulle prestazioni. Processazione
di una query con correlated subquery in MySQL. Correlated subquery nel SELECT.
2
Significato, impieghi e processazione in MySQL. View. Cosa sono e a che cosa servono. Creazione di una view e comando CREATE VIEW. Uso delle view per scomporre
le condizioni di query articolate. Esempi di impiego delle view. Clausola LIMIT.
Strategia di risoluzione multi-view. Raggruppamento. Significato, funzionamento
e impieghi. Clausola GROUP BY. Legame fra il raggruppamento e le correlated subquery. Come riconoscere una query con raggruppamento. Processazione di una
query con raggruppamento in MySQL. Proiezioni semanticamente corrette e legame con le dipendenze funzionali. Query con raggruppamento e record connessi agli
operatori di aggregazione. Esempio di risoluzione mediante NATURAL JOIN e derived table. Condizioni sui gruppi. Come funzionano, a che cosa servono e che cosa
possono includere. Clausola HAVING. Processazione in MySQL di una query con raggruppamento e condizioni sui gruppi. Come individuare le condizioni sui gruppi e le
condizioni sui record. Raggruppamento multi-attributo. Attributi nella proiezione
e dipendenza funzionale. Query insiemistiche. Corrispondenza insieme-tabella ed
elemento-record. Mapping fra gli operatori insiemistici e le proposizioni: appartenenza, esclusione e unione. Realizzazione dell’unione mediante la keyword UNION.
Unione con mantenimento dei duplicati ed esempio di query che usa UNION ALL.
Esercizi.
27 Aprile:
Valori statici nella proiezione. Esempio di utilizzo sui record perduti nel raggruppamento. Correlated subquery con correlazione nella clausola HAVING. Ancora sulle
query insiemistiche in MySQL: differenza, differenza simmetrica, intersezione, esistenza. Operatore di divisione: significato e impieghi. Tuple interdette. Due modi
di realizzare la divisione in MySQL: doppio NOT EXISTS; raggruppamento e condizione con conteggio combinato COUNT(DISTINCT) e COUNT(*). Modificatori ANY e ALL.
Utilizzo del modificatore ALL con gli operatori di confronto. Query complesse: a cosa servono e come sono strutturate. Query complesse nel business e nel data mining.
Metodologia di risoluzione di una query complessa. Esempio di risoluzione ragionata di una query complessa. Data manipulation language (DML) in MySQL. Inserimento di valori statici e valori ricavati. Comando INSERT INTO VALUES e comando
INSERT INTO SELECT: sintassi ed esempi di utilizzo. Inserimento di record a valori
in un sottoinsieme degli attributi dello schema. Aggiornamento. Comando UPDATE:
sintassi ed esempi di utilizzo. Cancellazione. Comando DELETE: sintassi ed esempi
di utilizzo. Cancellazione in presenza e in assenza di foreign key. Politiche di gestione di aggiornamento e cancellazione: NO ACTION; SET DEFAULT; SET NULL; CASCADE.
Problema della non riferibilità della target table nella clausola FROM in aggiornamento e cancellazione: cosa accade e cenni ai protocolli di lock. Locking delle tabelle in
MySQL. Due soluzioni al problema: derived table; join anticipato. Introduzione ai
database attivi. Paradigma evento-condizione-azione. Trigger in MySQL. Comando
3
CREATE TRIGGER. Tipologie di trigger: BEFORE e AFTER. Quando utilizzare un trigger
BEFORE e quando un trigger AFTER. Esempio di semplice trigger per la gestione di
un attributo ridondante. Record NEW. Trigger multi-statement. Ridefinizione del
delimitatore di fine statement: comando DELIMITER. Variabili user-defined ( @). Visi-
bilità, ciclo di vita e tipizzazione debole. Inizializzazione e settaggio di una variabile
user-defined mediante il comando SET. Controllo del flusso e istruzione condizionale
IF-ELSEIF-ELSE. Esempio di trigger multi-statement per l’attribuzione automatica
del ticket alle visite. Esercizi. Svolgimento dell’esercizio 3 del 10 Luglio 2013.
14 Maggio:
Vincoli generici in MySQL e business rule: creazione e gestione mediante trigger
BEFORE. Uso di SIGNAL per abortire l’esecuzione: codice SQLSTATE 45000. Impiego dei trigger per la gestione di attributi ridondanti. Data definition in MySQL
(DDL). Creazione, modifica strutturale e cancellazione di tabelle: sintassi dei comandi CREATE TABLE, ALTER TABLE e DROP. Posizionamento delle colonne: le keyword FIRST e AFTER. Vincoli di integrità referenziale e loro specifica mediante CONSTRAINT. Chiavi candidate e uso di UNIQUE. Introduzione alle stored procedure in
MySQL: concetti di base, utilità, impieghi. Considerazioni sulle prestazioni in architetture multi-tier. Riuso del codice, compilazione e caching sul DBMS. Comando
CREATE PROCEDURE e sintassi. Variabili tipizzate e comando DECLARE. Assegnamento
mediante SELECT INTO e mediante SET. Parametri di una stored procedure: tipologie IN, OUT e INOUT. Chiamata a stored procedure e comando CALL. Restituzione
di result set scalari mediante SELECT e mediante variabili OUT. Esercizi sulle stored
procedure.
15 Maggio:
Cursori in MySQL. Dichiarazione di cursori e comando DECLARE CURSOR. Funzionamento di un cursore. Apertura, prelievo e chiusura: comandi OPEN, FETCH e CLOSE.
Handler. Comando DECLARE HANDLER. Tipologie di handler: action CONTINUE ed
EXIT. Restituzione di result set scalari mediante variabili user-defined. Istruzioni
iterative in MySQL: costrutto LOOP. Gestione della terminazione mediante handler
e istruzione LEAVE. Esempio di stored procedure per la restituzione di un elenco
formattato mediante CONCAT. Gestione degli errori. Gerarchia degli errori: SQLEXCEPTION, SQLSTATE, SQLWARNING. Sollevare errori mediante SIGNAL. Stored function.
Comando CREATE FUNCTION. Risultato di una function e caching: keyword DETERMINISTIC/NOT DETERMINISTIC. Ranking function parametrica implementata mediante istruzione CASE su range. Utilizzo di function nelle stored procedure: esempio
di stored procedure con chiamata iterativa a ranking function per la realizzazione
di una classifica. Restituzione di result set mediante temporary table. Esercizi sui
trigger.
4
20 Maggio:
Introduzione al query optimization. Miglioramento delle performance mediante
ridondanze, indici, snapshot. Indici in MySQL. Cenni agli indici B-tree, B+-tree,
hash e complessità degli accessi. Prestazioni e organizzazione su disco. Cenni alla
memorizzazione e organizzazione dei record nei file. Problema della frammentazione e analogie con il File System di un moderno sistema operativo. Considerazioni
sui tempi di caricamento di indici e tabelle in memoria centrale: frammentazione
e swap. Esempio di query eseguita senza indice (full scan) e con indice (B-tree) sul
predicato WHERE. Tipologie di indici in MySQL: PRIMARY KEY, UNIQUE, INDEX, FULL
TEXT. Query lente e MySQL slow log. Principali ragioni che causano l’inefficienza
delle query. Analizzare il piano di esecuzione di una query in MySQL: il comando
EXPLAIN. Significato dei campi del risultato: id; select_type; table; type; possible_keys; key; key_len; ref; rows; Extra. Esempio guida di ottimizzazione di una
query con join ternario e predicato su range. Riconoscere e prevenire il full scan.
Aggiunta di un indice mediante ALTER TABLE ADD INDEX e CREATE INDEX. Capacità
di restrizione del result set di un predicato e legame con l’ordine di esecuzione scelto dall’optimizer. Join con ordine di esecuzione forzato: keyword STRAIGHT_JOIN.
Utilizzo forzato di un indice: comando FORCE INDEX. Calcolo della cardinalità del
result set. Aggiunta di indici per le chiavi esterne. Considerazioni conclusive sul
miglioramento delle prestazioni senza riscrittura del codice. Eliminazione di indici
e comando DROP INDEX. Refresh delle statistiche: ANALYZE TABLE. Refresh con ottimizzazione e compattamento: OPTIMIZE TABLE.
Risoluzione ragionata di due esercizi d’esame: es. 3 del 31/1/2015; es. 5 del 28/2/2014.
28 Maggio: Event. Idea alla base e principi di funzionamento. Impieghi degli event
per l’aggiornamento di ridondanze. Comando CREATE EVENT e sintassi. Scheduling
a singolo scatto e recurring: direttiva ON SCHEDULE AT|EVERY. Modificatori STARTS
ed ENDS per la modifica dell’istante di inizio e fine schedulazione. Diagramma di
stato di un event a singolo scatto e recurring. Direttiva ON COMPLETION. Attivazione
dello scheduler e variabile event_scheduler . Considerazioni sulla transazionalità all’interno di un event. Snapshot (o materialized view). Che cosa sono e a che
cosa servono. Differenza fra uno snapshot e una temporary table. Impieghi degli snapshot. Politiche di aggiornamento completo (full refresh) di uno snapshot:
immediate, deferred e on demand. Confronto fra le politiche di aggiornamento.
Esempio guida di creazione di uno snapshot di reporting. Stored procedure per on
demand refresh. Implementazione dell’immediate refresh mediante trigger di tipo
after. Implementazione del deferred refresh mediante event. Incremental refresh.
Concetto di log table. Ruolo dei timestamp e operazione di push sulla log table. Implementazione di una stored procedure per partial e full refresh. Flushing parziale
e totale della log table. Rebuild. Esercizio sulla gestione di una tabella ridondante
5
mediante event e trigger nell’ambito di un social network.
29 Maggio: Analytic function in MySQL. Generalità sull’analisi di grandi moli di
dati. Impieghi delle analytic function. Definizione di partition e diffrerenza rispetto ai gruppi. Aggregazione e rank su partition. Legame con la current row mediante
derived table o correlated subquery nel SELECT. Comando ORDER BY e modificatore
DESC. Problemi connessi all’efficienza su grandi moli di dati. Miglioramento delle
prestazioni mediante indici sugli attributi di correlazione. Rank e dense rank su
partition mediante GROUP_CONCAT e FIND_IN_SET. Dimensionamento del buffer di
concatenazione (variabile group_concat_max_len) a livello globale e di sessione: comando SET GLOBAL e SET SESSION. Verifica del valore impostato mediante il comando SHOW SESSION VARIABLES. Analytics efficiente. Utilizzo avanzato delle variabili
user-defined sfruttando l’ordine di processazione e invio del result set al client. Funzione row number. Concetto di lazy evaluation e rischi connessi. Forzare l’ordine
di assegnamento mediante le funzioni LEAST e GREATEST. Funzione dense rank e
rank. Query efficienti di tipo “top N positions within rank”. Window function. Caratteristiche e impieghi. Funzione lag e sua implementazione efficiente con range
unitario. Sliding window centrate sulla current row. Funzione moving average e sua
implementazione efficiente.
(Argomenti non inclusi nella prova pratica)
Introduzione ai database NoSQL. Aspetti principali di un RDBMS e caratteristiche borderline dei RDBMS attuali: l’esempio degli snapshot con deferred refresh.
Proprietà ACID di un sistema di gestione di basi di dati relazionali. Concetti di
consistency, availability e partition tolerance. Teorema CAP. Proprietà BASE nei
database NoSQL: basically available; soft state; eventual consistent. Scalabilità orizzontale e verticale. Standardizzazione. Caratteristiche di un DBMS di tipo NoSQL.
Concetto di cluster. Sharding e sharding con replicazione. Problema del join nei
contesti con sharding. Scalabilità orizzontale “a caldo”. Transazioni distribuite in
NoSQL. Modalità di partizionamento. Consistent hashing semplice e con replicazione. Tipologie di database NoSQL: key-value distribuiti; document oriented; column oriented; graph oriented. Querying su sistemi key-value e document oriented:
espressività delle richieste. Introduzione a Cassandra. Principali caratteristiche di
Cassandra. Architettura peer to peer e architettura client-server. Scalability. High availability e fault tolerance. Esempio di caduta di uno o più nodi del cluster.
Data model di tipo column oriented e concetto di database schema free. Concetto
di keyspace, column family, column e row key. Analogie con i database relazionali.
Vantaggi e svantaggi dell’approccio column oriented e delle column family. Semplice social network realizzato mediante approccio relazionale e NoSQL. Tunable
consistency: strong consistency ed eventual consistency.
6