4. Marco Pozzan
Lavoro con SQL server dalla versione 2000
Lavoro nella BI dal 2005
Presidente della community 1nn0va
(www.innovazionefvg.net)
Relatore in conferenze su SQL Server e BI in Friuli
Venezia Giulia e docente sulla BI.
Project menager del reparto Business Intelligence
della CGN S.P.A. (www.cgn.it)
Riferimenti:
twitter: @marcopozzan
email: info@marcopozzan.it
site: www.marcopozzan.it
4 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
5. Agenda
Gli strumenti di ETL
Caricamento tabella delle dimensioni
Slowly Changing Dimensions
Rolling Your Own ,T-SQL Merge, SCD Wizard, Other
Caricamento tabella dei fatti
Recupero chiavi surrogate con dimensioni SCD 1 e 2
Inferred members
Best Practices per le performance
Progettazione DWH
Progettazione SSIS
5 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
6. Strumenti di ETL
Gli strumenti di ETL:
Estraggono dati da fonti diverse
Trasformano i dati secondo le regole di business
Caricano i dati nelle strutture di destinazione (di
solito tabelle del DWH)
La piattaforma per la costruzione di un ETL
che useremo è Sql Server Integration
Services (SSIS) di Microsoft:
Versione pre 2012 : BIDS
Versione 2012 : Data Tools
6 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
7. SSIS - Caratteristiche
Caratteristiche:
Tool grafici per la creazione di package
Task per le funzionalità di workflow
Task per le funzionalità di data flow
Task amministrativi/email/FTP/file system
Programmabilità
Scripting (task sia nel control flow, sia nel data flow)
Estendibilità attraverso il modello ad oggetti
è possibile creare task custom
programmi esterni
7 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
8. SSIS – Scenari
Popolamento di data warehouse e data mart
Integrazione di dati eterogenei
Pulizia e standardizzazione dei dati
Automatizzazione di funzionalità
amministrative
Backup / restore, copia di oggetti di SQL
Server, process di cubi OLAP
8 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
9. Caricamento delle dimensioni
Ci sono due tipi di caricamento delle
dimensioni:
Full load : Cancello sempre i dati e poi ripopolo
la dimensione
Incremental load: non cancello mai i dati
Carico i dati dalla sorgente dati e con le SCD gestisco i
cambiamenti dei dati
Change Data Capture (CDC)
9 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
10. Slowly Changing Dimensions
SCD = Dimensione che varia nel tempo
Attenzione sono gli attributi che cambiano!!!
Si basano su due principi fondamentali
Determinare il cambiamento degli attributi
Confronto tra chiavi di business
10 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
11. Slowly Changing Dimensions
Esempio: DWH analisi clienti
Attributo del cliente “Città”
Nel 2012 il cliente Elena sposta di città la propria
azienda da Milano a Pordenone
I dati di Elena a quale “Città” vanno associati?
Pordenone: risulterà cliente della zona di
Pordenone, anche se non è vero, Elena era di Milano!
Milano: I dati sono legati alla città corretta se l’analisi la
facevo prima del 2012.
Dipende dal tipo di analisi che dobbiamo fare
11 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
12. Slowly Changing Dimensions – SCD 1
Tratteremo solo due tipi di SCD (tipo 1,tipo 2)
Tipo 1: Si tiene solo la versione corrente
quindi un’ analisi “AS IS” e non ci interessa il
passato
Nel nostro caso allora Elena ci interessa sapere
che ora risulta avere l’azienda a Pordenone.
Tutte le volte che cambia un attributo
buttiamo via il valore attuale e lo sostituiamo
con il nuovo.
12 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
13. Slowly Changing Dimensions – SCD 2
Tipo 2: Si ottiene una analisi “AS WAS” e
quindi quando varia un attributo:
Si mantiene tutta la storia
Creiamo un nuovo record e invalidiamo il record
attuale
Tutto il passato rimane congelato
Nel nostro caso sappiamo che prima del 2012
Elena aveva l’azienda a Milano e che ora è a
Pordenone.
13 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
15. SCD Wizard
Vantaggi
Facile il setup iniziale
Svantaggi
Tutti i confronti devono essere esatti
Non posso usare tutti i providers
Lentezza nelle lookup (non usa la cache) per ogni
riga sorgente si fa la lookup sulla dimensione
Difficile la modifica delle regole di business
15 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
16. Rolling Your Own
Vantaggi
Molto veloce
Può determinare i membri cancellati
Molto customizzabile e con un facile debug
Svantaggi
Alla vista sembra complicato
tempo per svilupparlo perchè richiede una
duplicazione del lavoro.
16 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
17. T-SQL Merge
Vantaggi
Molto efficiente
Svantaggi
Un T-SQL molto complicato con difficoltà di
debug
Difficile determinare o impostare una regola di
cambiamento delle righe
Se fallisce una riga fallisce tutto
17 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
18. T-SQL Merge
Si basa tutto sul comando MERGE:
novità di Sql Server 2008
possibilità di eseguire delle istruzioni di insert, update
e delete basandosi sui risultati di una join tra una
tabella di origine ed una di destinazione.
Attraverso l’esecuzione di un solo comando
E' comoda per operazioni di sincronizzazione tra
due tabelle nel caso esistano delle differenze.
18 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
19. T-SQL Merge
EmployeeID (S)
EmployeeName (S)
EmployeeID (T)
EmployeeName (T)
103
Bob
100
Mary
104
Steave
101
Sara
102
Stefano
19 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
20. Kimball Component
Anche se riporta il nome di Kimball non è
affiliato o supportato dal gruppo Kimball infatti
l’utlima versione è SCD dimension merge
(http://dimensionmergescd.codeplex.com/)
20 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
21. Kimball Component
Vantaggi
Facile da configurare e riconfigurare
Veloce esecuzione
Completamente configurabile a livello di matching
Svantaggi
Usa molta RAM e CPU
Non ha un buon supporto
21 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
22. Change data capture - CDC
Gestione manuale su sql
server 2008
Supporto nativo su sql server
2012 e permette anche di
usare la stessa tecnologia su
Oracle grazie ad Attunity
Non appesantisce l’istanza di
SQLServer al contrario di
altre soluzioni manuali
22 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
23. Change data Capture - CDC
Si basa sul LSN (Last Sequence Number): è
il puntatore ai log
Capture instance: finestra validità dei dati.
sys.fn_cdc_get_min_lsn(): limite inferiore
sys.fn_cdc_get_max_lsn():limite superiore
sys.fn_cdc_map_lsn_to_time: converte il
puntatore in data
Esempio:
sys.fn_cdc_map_lsn_to_time(sys.fn_cdc_get_max_lsn(
))
23 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
24. Change data Capture - CDC
La tabella che traccia le modifiche si trova
nelle system tables e ha lo stesso nome
tabella controllata + _CT:
campi della tabella controllata
Campo __$start_lsn: inizio transazione nei log
Campo __$end_lsn: termine transazione
Campo __$operation: operazione effettuata
Campo __$update_mask: maschera che indica il
campo
24 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
25. Change data capture - CDC
Per abilitare il CDC bisogna avere abilitato SQL
Server Agent (sys.sp_cdc_enable_db)
Per definire le tabelle da monitorare:
sys.sp_cdc_enable_table @source_schema =
N'import', @source_name =
N'Product_Init', @role_name =
N'cdc', @supports_net_changes = 1
Per recupera le transazioni dalla tabella X delle
modifiche: Cdc.fn_cdc_get_all_changes_dbo_X
Esempio: Cdc.fn_cdc_get_all_changes_dbo_Prodotti
25 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
26. Caricamento tabella dei fatti
Ci sono due tipi di caricamenti
Full load: carico sempre tutta la tabella dei fatti
performance molto basse
Esempio: Se ho la tabella delle vendite con 1.000.000
vendite il 16-11-2012 e 2.000.000 il 17-11-2012 allora il
caricamento del 17 sarà di 3.000.000 righe di cui
1.000.000 le avevo già caricate il 16
Tempi di caricamento si allungano sempre più
Incremental Load
si leggono solo i record che non sono già caricati nel
nostro sistema DWH
26 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
27. Caricamento tabella dei fatti
Ma come possiamo garantire di leggere
"solo" i record che non sono "già" letti?
Aggiungiamo un campo "data entry" :
rappresenta la data in cui si è verificato quel fatto
Dopo ogni caricamento si salva in una tabella
"Batch" la data massima caricata
Il giorno dopo dobbiamo estrarre i record che
hanno una data successiva quella salvata nella
tabella batch
27 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
28. Caricamento tabella dei fatti
Estrazione dei dati dei fatti dalla sorgente
Recuperare le chiavi surrogate dalle dimensioni
attraverso la b-key con:
Lookup transformation
range-lookup (SCD 2):
Lookup transformation (semplice ma poco performante per
tante righe)
Merge join (leggermente complicato rispetto alla lookup ma
offre migliori performance con tante righe)
Script (molto complicato ma il più performante)
http://blogs.msdn.com/b/mattm/archive/2008/11/25/lookuppattern-range-lookups.aspx (Matt Masson)
28 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
29. Inferred member - Problema
Quando si esegue una ricerca sulle
dimensioni per ottenere la chiave surrogata
cosa può capitare?
Se si trova una corrispondenza della b-key allora
si ottiene la chiave surrogata e si inserisce il dato
nella tabella dei fatti.
Se non si trova una corrispondenza: Inferred
member
29 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
30. Inferred member - Soluzione
Due modi per risolvere il problema:
(offline analysis)
Usare il “record tappo”: assegnare una chiave
predeterminata della dimensione (-1,n/n, unknown
member,…
Redirect delle righe in un file o in una tabella di errore
(on-line analysis)
creare e assegnare una nuova chiave surrogata nella
dimensione al volo.
30 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
31. Inferred member – on-line analysis
Tre modi per realizzare on-line analysis
Metodo
Svantaggi
Vantaggi
Usando le store
procedure
Molto complicato e
lento lo sviluppo
Non necessita di SSIS
SSIS – Utilizzando un
doppio lookup
Problemi di prestazioni Si ha una buona
sulla Union All usata
riusabilità e velocità
per unire le righe con
nella realizzazione
gli inferred member
con le altre righe.
SSIS – Script
Component
Sono richiesti dei
requisiti di .NET
31 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
Si ha una buona
riusabilità e velocità
nella realizzazione
32. Inferred member – on line analysis
Schema generale:
righe fatti
Trova le righe
che non
esistono nella
dimensione
righe che esistono nella
dimensione
32 | 17/11/2012 |
Righe con
chiave
surrogata
Righe senza
chiave
surrogata
Genera una nuova
chiave surrogata (se
non si ha identity)
Unisce tutte
le righe dei
fatti
Inserisce la riga
nella dimensione
con il flag inferred a
true
SQL Saturday #176 – Pordenone, Italy
Ritorna la nuova
chiave surrogata
Inserisce fatti
33. Best practices take-away - Facts
Se i fatti > 50 gb usare le partizioni (su chiave
data – abilitare lo sliding window)
Più velocità nel caricamento e nella cancellazione
Query più veloci su singola partizione
Migliore gestione degli indici
Indici clustered sulla colonna data
Migliora il recupero dei dati storici
Ottengo query migliori per popolare il cubo
33 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
34. Best practices take-away - Facts
Usare opzione ALLOW_ROW_LOCKS =
OFF e ALLOW_PAGE_LOCKS = OFF
sull’indice clustered:
Operazioni di table scan più veloci a query-time
Evita eccessive operazioni di locks durante
update pesanti
34 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
35. Best practices take-away - Dimensions
Usare chiavi surrogate di tipo integer per tutte le
dimensioni
Usare una chiave (non surrogata) di tipo intero che
rappresenti la data anche per la dimensione tempo
(esempio: 20121117)
Usare interi di piccole dimensioni per le chiavi
surrogate
in modo da tenere ridotta la tabella dei fatti
Sulla chiave surrogata costruire un indice
clustered
Questa è la chiave principale
35 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
36. Best practices take-away - Dimensions
Indici non-clustered sulla business key
eventualmente combinata con “effective date”
per aiutare il recupero delle chiavi surrogate
Indici non-clustered su tutte le colonne della
dimensione usate frequentemente per la ricerca
Evitare il partizionamento di una dimensione
Impostare le chiavi esterne tra la tabella dei fatti
e la tabella delle dimensioni ma impostare a
NOCHECK per consentire un caricamento più
veloce
36 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
37. SSIS best practices take-away
Migliorare le performance del Control Flow
Evitare cicli:
Foreach loop
Loop
Sfruttare il parallelismo
37 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
38. SSIS best practices take-away
Migliorare le performance del Data Flow
Sfruttare il parallelismo
Ridurre il volume dei dati quando possibile
Attenzione ai componenti che si usano:
Livello prestazione
Tipo di componenti
Prestazioni non tanto buone
Merge join, Merge, Union All, Pivot
Prestazioni molto basse
Sort, Aggregate, Fuzzy Grouping,
OLE DB Command
38 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy
39. Link
SQLIS http://www.sqlis.com/
Microsoft Integration Services
http://msdn.microsoft.com/it-it/sqlserver/cc511477
http://msdn.microsoft.com/en-us/library/ms141026.aspx
Data Loading Perfomance Guide
http://msdn.microsoft.com/en-us/library/dd425070(v=sql.100).aspx
39 | 17/11/2012 |
SQL Saturday #176 – Pordenone, Italy