Upload
marco-pozzan
View
517
Download
1
Embed Size (px)
DESCRIPTION
Sql saturday #176 Pordenone
Citation preview
SQL Saturday #176
Pordenone, Italy
Using Integration Services
to load the DWH
17/11/2012 | SQL Saturday #176 – Pordenone, Italy
SQL Saturday #176 – Pordenone, Italy17/11/2012 | 2 |
SQL Saturday #176 – Pordenone, Italy
#sqlsat176
17/11/2012 | 3 |
SQL Saturday #176 – Pordenone, Italy
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: [email protected] site: www.marcopozzan.it
17/11/2012 | 4 |
SQL Saturday #176 – Pordenone, Italy
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
17/11/2012 | 5 |
SQL Saturday #176 – Pordenone, Italy
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
17/11/2012 | 6 |
SQL Saturday #176 – Pordenone, Italy
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
17/11/2012 | 7 |
SQL Saturday #176 – Pordenone, Italy
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
17/11/2012 | 8 |
SQL Saturday #176 – Pordenone, Italy
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)
17/11/2012 | 9 |
SQL Saturday #176 – Pordenone, Italy
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
17/11/2012 | 10 |
SQL Saturday #176 – Pordenone, Italy
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
17/11/2012 | 11 |
SQL Saturday #176 – Pordenone, Italy
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.
17/11/2012 | 12 |
SQL Saturday #176 – Pordenone, Italy
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.
17/11/2012 | 13 |
SQL Saturday #176 – Pordenone, Italy
Slowly Changing Dimensions
SCD Wizard (Free) Rolling Your Own (Free) T-SQL Merge (Free) Third-Party
Kimball Component (Free) Table Difference Component (non più free:
CozyRoc’s)
17/11/2012 | 14 |
SQL Saturday #176 – Pordenone, Italy
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
17/11/2012 | 15 |
SQL Saturday #176 – Pordenone, Italy
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.
17/11/2012 | 16 |
SQL Saturday #176 – Pordenone, Italy
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/11/2012 | 17 |
SQL Saturday #176 – Pordenone, Italy
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.
17/11/2012 | 18 |
SQL Saturday #176 – Pordenone, Italy
T-SQL Merge
17/11/2012 | 19 |
EmployeeID (S) EmployeeName (S)
103 Bob
104 Steave
EmployeeID (T) EmployeeName (T)
100 Mary
101 Sara
102 Stefano
SQL Saturday #176 – Pordenone, Italy
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/)
17/11/2012 | 20 |
SQL Saturday #176 – Pordenone, Italy
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
17/11/2012 | 21 |
SQL Saturday #176 – Pordenone, Italy
Change data capture - CDC
17/11/2012 | 22 |
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
SQL Saturday #176 – Pordenone, Italy
Change data Capture - CDC
17/11/2012 | 23 |
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())
SQL Saturday #176 – Pordenone, Italy
Change data Capture - CDC
17/11/2012 | 24 |
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
SQL Saturday #176 – Pordenone, Italy
Change data capture - CDC
17/11/2012 | 25 |
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
SQL Saturday #176 – Pordenone, Italy
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
17/11/2012 | 26 |
SQL Saturday #176 – Pordenone, Italy
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
17/11/2012 | 27 |
SQL Saturday #176 – Pordenone, Italy
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/lookup-pattern-range-lookups.aspx (Matt Masson)
17/11/2012 | 28 |
SQL Saturday #176 – Pordenone, Italy
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
17/11/2012 | 29 |
SQL Saturday #176 – Pordenone, Italy
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.
17/11/2012 | 30 |
SQL Saturday #176 – Pordenone, Italy
Inferred member – on-line analysis
Tre modi per realizzare on-line analysis
17/11/2012 | 31 |
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 sulla Union All usata per unire le righe con gli inferred member con le altre righe.
Si ha una buona riusabilità e velocità nella realizzazione
SSIS – Script Component
Sono richiesti dei requisiti di .NET
Si ha una buona riusabilità e velocità nella realizzazione
SQL Saturday #176 – Pordenone, Italy
Inferred member – on line analysis
Schema generale:
17/11/2012 | 32 |
Trova le righe che non esistono nella dimensione
Unisce tutte le righe dei fatti
righe fattirighe che esistono nella
dimensioneInserisce fatti
Rig
he
sen
za
chia
ve
surro
ga
taR
igh
e c
on
ch
iave
su
rro
ga
ta
Genera una nuova chiave surrogata (se non si ha identity)
Inserisce la riga nella dimensione con il flag inferred a true
Ritorna la nuova chiave surrogata
SQL Saturday #176 – Pordenone, Italy
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
Best practices take-away - Facts
17/11/2012 | 33 |
SQL Saturday #176 – Pordenone, Italy
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
Best practices take-away - Facts
17/11/2012 | 34 |
SQL Saturday #176 – Pordenone, Italy
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
17/11/2012 | 35 |
SQL Saturday #176 – Pordenone, Italy
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
Best practices take-away - Dimensions
17/11/2012 | 36 |
SQL Saturday #176 – Pordenone, Italy
SSIS best practices take-away
Migliorare le performance del Control Flow Evitare cicli:
Foreach loop Loop
Sfruttare il parallelismo
17/11/2012 | 37 |
SQL Saturday #176 – Pordenone, Italy
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:
17/11/2012 | 38 |
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
SQL Saturday #176 – Pordenone, Italy
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
17/11/2012 | 39 |
SQL Saturday #176 – Pordenone, Italy
Q & A
17/11/2012 | 40 |
SQL Saturday #176 – Pordenone, Italy
GRAZIE!Commenta la sessione che hai
appena seguito su Twitter
#sqlsat176
17/11/2012 | 41 |