Implementare il caricamento delle tabelle dimensionali utilizzando la logica delle SCD2 non è un compito facile. Anche se utilizzate dei tool ETL, l’argomento è complesso ed estremamente delicato.
Il test deve essere molto accurato, perché se c’è un problema nella gestione delle SCD2, e non ve ne accorgete immediatamente, può entrare in crisi l’intero progetto di Data Warehouse.
L’utente che scoprirà l’anomalia inizierà a pensare che il dato non è attendibile, con tutte le conseguenze che ciò comporta. Inoltre, porre rimedio a posteriori a un problema implementativo sulle SCD2, può richiedere la rielaborazione di tutti i dati, poichè le chiavi dimensionali artificiali sono ormai "embedded" nelle Fact Tables.
Il controllo delle SCD2 caricando una tabella di questo tipo ci garantisce che tutte le righe anagrafiche che sono presenti nella Staging Area sono state trattate, senza duplicazioni né mancanze.
Per comodità si può creare una semplice vista che verifichi l’esistenza di problemi costruita
sugli stessi campi della tabella ma con l’aggiunta di due campi di controllo costruiti con:
(CASE WHEN (ALL_CNT=(NEW_CNT + UPD_CNT + EQUAL_CNT + NEW_VER_CNT + UPD_ALL_CNT))
THEN 'OK'
ELSE 'NOT OK'
END) RET_COD
Il test deve essere molto accurato, perché se c’è un problema nella gestione delle SCD2, e non ve ne accorgete immediatamente, può entrare in crisi l’intero progetto di Data Warehouse.
L’utente che scoprirà l’anomalia inizierà a pensare che il dato non è attendibile, con tutte le conseguenze che ciò comporta. Inoltre, porre rimedio a posteriori a un problema implementativo sulle SCD2, può richiedere la rielaborazione di tutti i dati, poichè le chiavi dimensionali artificiali sono ormai "embedded" nelle Fact Tables.
La tabella di controllo delle SCD2
Un aiuto per il controllo della gestione corretta delle SCD2, è il caricamento di una tabella di log (vedila come una componente della Micro ETL Foundation) che valorizzi in dettaglio l’esito del caricamento della tabella dimensionale. Chiameremo questa tabella XXX_COM_MEF_CDI_LOT.
I nomi delle colonne sono solo indicativi e seguono la Naming Convention accennata nel post sul Partizionamento logico (I requisiti della Micro ETL Foundation).
Brevemente: XXX è il codice di progetto, COM indica che è l’area Comune, MEF significa Micro Etl Foundation, CDI significa Conformed Dimension, LOT significa Log Table
Vediamo quali sono le informazioni necessarie.Ecco il significato dei singoli campi.
Vediamo quali sono le informazioni necessarie.Ecco il significato dei singoli campi.
- DIM_COD = Dimensione. E’ il nome fisico della tabella dimensionale.
- GG_KEY = Giorno. La data nel formato YYYYMMDD del giorno di caricamento della dimensione
- ALL_CNT = Semplice contatore del numero di righe che sono state prese in considerazione per il processing della dimensione. In pratica è il numero di righe della tabella anagrafica presente nella Staging Area, che saranno inserite o andranno a modificare le righe presenti nella tabella dimensionale.
- NEW_CNT = Contatore del numero righe che sono diventate nuove occorrenze nella tabella dimensionale. Se parliamo di una dimensione cliente, conterrà quanti nuovi clienti sono stati inseriti.
- UPD_CNT = Contatore del numero righe che hanno aggiornato occorrenze già presenti nella tabella dimensionale. Come sappiamo, non tutti i campi della dimensione richiedono un versionamento, per alcuni è sufficiente un update del valore.
- EQUAL_CNT = Contatore del numero righe che sono rimaste immutate dal caricamento precedente. Se noi processiamo la dimensione cliente tutti i giorni, è probabile che la maggior parte dei clienti sia già presente e non abbia subito modifiche versionanti. E’ il caso più frequente se parliamo di “slowly” changing dimension e non di “rapid” changing dimension. Anche dal punto di vista statistico, il confronto fra questo campo e il contatore ALL_CNT ci può dare indicazioni utili per capire la “psicologia” della dimensione di analisi.
- NEW_VER_CNT = Contatore del numero righe che hanno prodotto un versionamento nella dimensione finale.
- UPD_ALL_CNT = Contatore del numero righe che hanno richiesto un update totale della riga dimensionale. Questo caso si verifica quando in una tabella dei fatti giunge un codice, per esempio cliente, che per qualche motivo, non è giunto nel flusso giornaliero dell’anagrafica clienti. In questi casi, consiglio sempre di caricare in ogni caso il nuovo codice cliente nella tabella dimensionale ( lasciando a null o a un valore di default tutti gli altri campi). Se il giorno arriva il codice cliente mancante, bisogna fare attenzione perché non si tratta di un versionamento, ma dell’update totale di tutti i campi.
- STAMP_DTS = Data dell’inserzione della riga in formato "date"
- EXEC_CNT = Codice del run del job del processo di caricamento.
Il controllo delle SCD2 caricando una tabella di questo tipo ci garantisce che tutte le righe anagrafiche che sono presenti nella Staging Area sono state trattate, senza duplicazioni né mancanze.
Per comodità si può creare una semplice vista che verifichi l’esistenza di problemi costruita
sugli stessi campi della tabella ma con l’aggiunta di due campi di controllo costruiti con:
(CASE WHEN (ALL_CNT=(NEW_CNT + UPD_CNT + EQUAL_CNT + NEW_VER_CNT + UPD_ALL_CNT))
THEN 'OK'
ELSE 'NOT OK'
END) RET_COD
Un OK su questo codice di ritorno, ci assicura che la somma di tutte le insert/update dimensionali corrisponde al totale di tutte le righe di input da Staging Area
(CASE WHEN ((EQUAL_CNT=0) OR (NEW_CNT>(ALL_CNT/2)))
THEN 'WARNING'
ELSE ' OK'
END) RET2_COD
(CASE WHEN ((EQUAL_CNT=0) OR (NEW_CNT>(ALL_CNT/2)))
THEN 'WARNING'
ELSE ' OK'
END) RET2_COD
Un Warning su questo codice di ritorno, ci avvisa che tutte le righe di input erano nuovi codici (molto strano) oppure che il numero di nuovi codici supera la metà di tutti i codici giunti in input (altrettanto strano)
Queste segnalazioni di warning sono utili per identificare problemi che potrebbero sorgere in casi particolari. Ecco un esempio (realmente accaduto)
Queste segnalazioni di warning sono utili per identificare problemi che potrebbero sorgere in casi particolari. Ecco un esempio (realmente accaduto)
Per semplicità supponiamo di avere una dimensione cliente la cui chiave principale è costituita
dalla coppia codice società e codice cliente (spesso conosciuto in banca come codice NDG).
Il codice cliente è di 12 char del tipo '000000342648'. Nella notte, c’è stato un problema sul sistema alimentante.
Il codice cliente presente nel flusso giornaliero dell’anagrafica clienti non è stato "riempito" di
zeri a sinistra, per cui il codice cliente è arrivato con tutti blank a sinistra (un carattere a tutti gli effetti),cioè ' 342648'.
Questo fatto ha generato la duplicazione di tutta la dimensione cliente, in quanto quei codici risultavano tutti nuovi.
dalla coppia codice società e codice cliente (spesso conosciuto in banca come codice NDG).
Il codice cliente è di 12 char del tipo '000000342648'. Nella notte, c’è stato un problema sul sistema alimentante.
Il codice cliente presente nel flusso giornaliero dell’anagrafica clienti non è stato "riempito" di
zeri a sinistra, per cui il codice cliente è arrivato con tutti blank a sinistra (un carattere a tutti gli effetti),cioè ' 342648'.
Questo fatto ha generato la duplicazione di tutta la dimensione cliente, in quanto quei codici risultavano tutti nuovi.
Ecco perchè la vista di log è importante. Il campo equal_cnt era rimasto a zero, rivelando il warning.
Ovviamente ognuno di noi imposterà le condizioni di Warning secondo le proprie esigenze, e quello mostrato è solo un esempio personale.
Ovviamente ognuno di noi imposterà le condizioni di Warning secondo le proprie esigenze, e quello mostrato è solo un esempio personale.
Sicuramente questa tabella/vista di controllo è un altro elemento utile della Micro ETL Foundation.

