Sistemi Informativi Avanzati Anno Accademico 2012/2013 Prof. Domenico Beneventano Estensioni del linguaggio SQL per interrogazioni OLAP Esempio! Esempio delle vendite con scontrino (nella tabella, per semplicità, il tipo è sottinteso dal nome del prodotto) TIPO PREZZO DATA PRODOTTO (1,N) VENDITA (1,N) SCONTRINO " Misure 1. NUMERO_VENDITE = COUNT(*) 2. PREZZO_MEDIO = AVG (PREZZO) 3. NUMERO_CLIENTI = COUNT(DISTINCT SCONTRINO) il numero clienti è valutato contando gli scontrini 4. NUMERO_PRODOTTI = COUNT(DISTINCT PRODOTTO) per valutare quanti differenti prodotti vengono venduti 2
Esempio: Analisi dei dati - aggregazione! Le dimensioni di analisi sono MESE e TIPO DB OPERAZIONALE! Il report completo da ottenere è il seguente: REPORT : MESE-TIPO, tutte le misure, con i totali Legenda 3 Esempio: Analisi dei dati - aggregazione! Il report si può ottenere con i vari strumenti OLAP (cubo multidimensionale, tabelle pivot, SQL-OLAP!) DB OPERAZIONALE! SQL-OLAP estende l operatore di raggruppamento GROUP BY consentendo di ottenere più raggruppamenti (più pattern) in un unica query SQL SQL-OLAP 4
Estensioni OLAP in SQL! SQL99 è stato il primo standard SQL ad offrire soluzioni per l analisi dei dati: questa parte dello standard viene normalmente chiamata SQL-OLAP (BNF SQL99: http://savage.net.au/sql/sql-99.bnf.html) Operatore Data Cube (Jim Gray et all - Microsoft/IBM paul.rutgers.edu/~aminabdu/cs541/cube_op.pdf)! SQL-OLAP è disponibile nei principali DMBS (ORACLE, SQL SERVER, POSTGRES); in alcuni (MySQL) le funzionalità OLAP sono limitate! Dove e quando usare SQL-OLAP? 1. Nel generico DB operazionale, per ottenere dei semplici ma completi report al volo, senza costruirsi il Data Mart 2. Nel Data Mart, come strumento OLAP ausiliario, utile per la sua immediatezza (non devo costruire il cubo multidimensionale), soprattutto come per la verifica dei risultati (il cubo dimensionale restituisce risultati corretti?) 5 Schema di fatto: Pattern di aggregazione! Schema di Fatto: PRODOTTO Dimensioni = { CASSA, RODOTTO} NEGOZIO CASSA VENDITA Attributi Dimensionali D = { CASSA, PRODOTTO, NEGOZIO }! Un raggruppamento viene specificato tramite un sottoinsieme S di D di attributi dimensionali! Un sottoinsieme S di D con due attributi A e B tali che A! B specifica un raggruppamento non significativo in quanto il raggruppamento su A,B equivale al raggruppamento su A! Un sottoinsieme S di D tale che non esistano due attributi A e B con A! B è detto pattern (o cuboide) 6
Esempio Schema di Fatto VENDITA RAPPRESENTANTE MESE FORNITORE CITTA NEGOZIO SETTIMANA VENDITA QUANTITA GUADAGNO CATEGORIA PRODOTTO Star Schema 7 Misura QUANTITA additiva: Calcolo delle misure Per eseguire : select P, SUM(QUANTITA) " " " "from VENDITA " " " "group by P!! si usa per semplicità la vista VENDITA ottenuta come join della Fact Table e delle Dimension Table 8
Interrogazioni semplici: un solo pattern " Schema di Fatto: Specifica concettuale dell interrogazione 1. Pattern di aggregazione Per ogni CITTA e SETTIMANA! 2. Misure! il totale della QUANTITA! 3. Condizione! solo per i prodotti alimentari! " Star Schema : implementazione dell interrogazione in SQL SELECT CITTA,SETTIMANA, WHERE CATEGORIA = 'ALIM' GROUP BY CITTA, SETTIMANA " La specifica della condizione è banale e verrà trascurata " Si considerano per ora solo misure additive (operatore SUM) 9 Per ottenere più pattern : UNION! Una query di GROUP BY realizza un singolo pattern : per ottenere in una singola query più pattern (cioè per ottenere nella stessa query anche i valori aggregati dei risultati ) si deve usare UNION { CITTA, SETTIMANA } { CITTA} {} SELECT CITTA,SETTIMANA, GROUP BY CITTA, SETTIMANA UNION SELECT CITTA, NULL AS SETTIMANA, GROUP BY CITTA UNION SELECT NULL AS CITTA, NULL AS SETTIMANA, 10
Estensioni OLAP : più pattern! Le estensioni OLAP forniscono particolari operatori che consentono di realizzare più pattern con una singola query di GROUP BY { CITTA, SETTIMANA } { CITTA} SELECT CITTA,SETTIMANA, GROUP BY GROUPING SETS ( (CITTA, SETTIMANA), (CITTA), () ) {} Questo è il risultato della query a meno dell ordinamento. Per ottenere l ordine visualizzato: "ORDER BY GROUPING(CITTA) ASC, GROUPING(SETTIMANA)ASC, CITTA ASC 11 L operatore GROUPING SETS! Schema di Fatto con attributi dimensionali D = {A1, A2,!, An} insieme S = {A1, A2,!, Ak}! Raggruppamento semplice in SQL : GROUP BY A1, A2,!, Ak # Realizzazione di S: visualizzazione dell aggregazione rispetto a S! L operatore GROUPING SETS consente di realizzare più insiemi Si in un unica query di raggruppamento GROUP BY GROUPING SETS ( S1, S2,!, Sp) # Realizzazione degli insiemi Si: equivale alla union di GROUP BY Si # L ordine degli insiemi S1, S2,!, Sp è irrilevante. # Gli insiemi S1, S2,!, Sp possono essere uguali e/o sovrapposti # In uscita dalla query si possono riportare gli attributi di S1 # S2 #! # Sp # In SQL un insieme S è specificato con S = (A1, A2,!, Ak)
Gli operatori CUBE e ROLLUP! GROUP BY CUBE (A1, A2,!, Ak) # Realizzazione dell insieme {A1, A2,!, Ak} e di tutti i suoi sottoinsiemi (2 n elementi dell insieme potenza di {A1, A2,!, Ak}). # L ordine degli attributi nella GROUP BY è irrilevante. # Sintassi alternativa: GROUP BY A1, A2,!, Ak WITH CUBE! GROUP BY ROLLUP (A1, A2,!, Ak) # Realizzazione dell insieme {A1, A2,!, Ak} e dei seguenti k sottoinsiemi {A1, A2,!, Ak-1 }, {A1, A2,!, Ak-2 }! {A1} {} # L ordine degli attributi nella GROUP BY è rilevante. # Sintassi alternativa: GROUP BY A1, A2,!, Ak WITH ROLLUP! Nel citato articolo di Jim Gray et all viene proposta un algebra di questi operatori (alcuni esempi sono anche nei manuali dei DBMS, come nel caso di SQL SERVER: msdn.microsoft.com/it-it/library/bb510427)! In queste slide : casi significativi tramite esempi ALL (All Values )! Per visualizzare nella stessa query più livelli di aggregazione la teoria SQL usa un valore polimorfo ALL : in {CITTA}: ALL nella colonna SETTIMANA indica tutte le settimane; in {SETTIMANA }: ALL nella colonna CITTA indica tutte le citta. Il pattern vuoto {} corrisponde ad una singola riga con tutti ALL SELECT CITTA,SETTIMANA, GROUP BY CUBE (CITTA, SETTIMANA) {CITTA,SETTIMANA} {CITTA} {SETTIMANA} {} 14
SQL-OLAP in SQL-SERVER! In SQL-SERVER (e in genere nei DBMS) il valore ALL è visualizzato come NULL e si usa una funzione booleana GROUPING in grado di individuare ALL GROUPING(Ai) = 1 se Ai=ALL, 0 altrimenti GROUPING(CITTA)=1 nei pattern che non contengono CITTA, cioè nei pattern che raggruppano su CITTA # La funzione GROUPING si può usare solo con GROUPING SETS, CUBE e ROLLUP 15 SQL-OLAP in SQL-SERVER! Con GROUPING si può visualizzare ALL, oppure differenziare con un valore specifico: 'TutteLeCitta, TutteLesettimane # La logica della query non cambia: nel seguito si visualizzerà NULL! 16
Operatore CUBE! GROUP BY CUBE (A1, A2,!, Ak) o GROUP BY A1, A2,!, Ak WITH CUBE {CITTA} e {} {CITTA,FORNITORE,MESE} {FORNITORE,MESE} {CITTA,FORNITORE}! {MESE} {} 17 ROLLUP! roll-up lungo la dimensione NEGOZIO:! L operatore ROLLUP può essere applicato ad una sequenza generica, non necessariamente ad una sequenza di attributi dimensionali di una gerarchia: il risultato è comunque poco significativo! 18