Tracciare le modifiche ai dati e allineare i datawarehouse con il Change Data Capture in SQL Server 2008

3 pagine in totale: <<Indietro 1 2 [3]

In questa tabella il job che esegue il "capture" delle modifiche (ciò avviene in maniera asincrona rispetto alla modifica stessa) andrà a scrivere una riga per ogni record coinvolto da una modifica ai dati nella tabella dbo.Orders.

Avendo definito l'infrastruttura del CDC, siamo pronti per inserire dei nuovi record nella tabella dbo.Orders; pochi istanti dopo, sempre che il servizio SQL Server Agent sia in esecuzione, nella tabella cdc.TrackOrders_CT troviamo traccia delle modifiche apportate.

INSERT dbo.Orders VALUES ('20080118', 2, 12, 50, 100)
INSERT dbo.Orders VALUES ('20080118', 2, 25, 45, 35)
GO

SELECT * FROM cdc.dbo_Orders_CT
GO

Ovviamente anche le attività di cancellazione e modifica dei dati vengono intercettate dal CDC; in particolare le attività di aggiornamento producono due righe per ciascun record coinvolto dall'istruzione di update: un record che rappresenta la "versione" prima della modifica ed un record che rappresenta la situzione post aggiornamento.

DELETE dbo.Orders
WHERE ID = 27

UPDATE dbo.Orders
SET Qta = 90
WHERE ID = 26

Come si può vedere da una select sulla tabella di tracking, è il valore che assume il campo __$operation a rivelarci quale operazione è stata eseguita sul record indicato. Questo campo può assumere 4 differenti valori il cui significato è schematizzato nella seguente tabella:

ValoreSignificato
1DELETE
2INSERT
3UPDATE (è il record prima della modifica)
4UPDATE (la nuova versione del record)

Utilizzare i dati di tracking

Una volta che i dati sono stati letti dal transaction log e inseriti nella tabella di tracking da parte del job di cattura, possiamo dire conclusa la nostra attività se l'unico obiettivo è quello di mantenere in linea, per un tempo stabilito e direttamente legato alle impostazioni del cleanup, tutte le modifiche che sono state apportate a determinate tabelle.

Se invece l'esigenza è quella di mantenere allineata una tabella di riepilogo dobbiamo scrivere una procedura che, in base al contenuto delle tabelle di tracking, apporti le necessarie modifiche alle tabelle di sintesi.

Per consolidare i record presenti nella tabella di tracking con quanto già presente nelle tabelle di sintesi ci viene in aiuto un'altra interessante novità introdotta in SQL Server 2008: l'operatore MERGE. Utilizzando questo operatore possiamo inserire, modificare o eliminare dei dati in una target table sulla base di una source table e di una condizione di join che le lega logicamente fra loro. Le nostre target table sono le tabelle dbo.OrdersByWeek e dbo.OrdersByCust, mentre la source table è una tabella derivata dalla tabella di tracking. Tradotto in Transact SQL le due istruzioni MERGE necessarie per allineare le nostre tabelle di sintesi possono essere scritte come segue:

BEGIN TRAN

--Merge in dbo.OrdersByWeek
MERGE dbo.OrdersByWeek AS trg
USING (SELECT YEAR(Data) Anno, DATEPART(week, Data) settimana, IDArticolo,
        SUM(CASE
                WHEN __$operation IN (2, 4) THEN Qta
                ELSE Qta * -1
            END) AS Qta
    FROM cdc.TrackOrders_CT WITH (TABLOCKX)
    GROUP BY YEAR(Data), DATEPART(week, Data), IDArticolo) AS src
ON (trg.Anno = src.Anno
        AND trg.Settimana = src.Settimana
        AND trg.IDArticolo = src.IDArticolo)
WHEN MATCHED THEN
    UPDATE SET trg.Qta = trg.Qta + src.Qta
WHEN NOT MATCHED THEN
    INSERT (Anno, Settimana, IDArticolo, Qta)
        VALUES (src.Anno, src.Settimana, src.IDArticolo, src.Qta);

--Merge in dbo.OrdersByCust
MERGE dbo.OrdersByCust AS trg
USING (SELECT YEAR(Data) Anno, IDCliente,
    SUM(CASE
            WHEN __$operation IN (2, 4) THEN Importo * Qta
            ELSE Importo * Qta * -1
            END) Importo
FROM cdc.TrackOrders_CT
GROUP BY YEAR(Data), IDCliente) AS src
ON (trg.Anno = src.Anno
        AND trg.IDCliente = src.IDCliente)
WHEN MATCHED THEN
    UPDATE SET trg.Importo = trg.Importo + src.Importo
WHEN NOT MATCHED THEN
    INSERT (Anno, IDCliente, Importo)
        VALUES (src.Anno, src.IDCliente, src.Importo);

TRUNCATE TABLE cdc.TrackOrders
COMMIT TRAN
GO

Questa istruzione può essere schedulata secondo la frequenza con cui vogliamo allineare i dati nelle due tabelle di riepilogo, ovvero in base al ritardo ammesso per l'allineamento dei dati fra le tabelle OLTP e quelle necessarie al supporto decisionale.

Conclusioni

Il CDC è una delle (tante) interessanti novità di SQL Server 2008 in grado di semplificare e snellire molte attività di consolidamento dei datawarehouse o di semplici tabelle di riepilogo, come negli esempi mostrati in questo articolo.

Finora questo tipo di esigenze venivano soddisfatte tramite trigger oppure tramite job schedulati che, però, rielaboravano tutti i dati della tabella analitica. In tali casi, in presenza di grandi quantità di record, l'attività può richiedere molte ore e la finestra temporale a disposizione, tipicamente gli orari notturni o i giorni del fine settimana, deve essere condivisa con altre attività amministrative come i backup dei dati, la ricostruzione degli indici ed i controlli di allocazione. Con il CDC siamo in grado di consolidare nelle tabelle di sintesi solo i delta rispetto alle precedenti acquisizioni a tutto vantaggio dei tempi necessari all'attività. La prossima volta che chiederemo al DBA di individuare una finestra utile è probabile che abbia reazioni meno traumatiche di quelle avute finora.

Nota dell'autore

Quanto riportato in questo articolo si basa su una versione preliminare di SQL Server 2008 e precisamente una build, riservata agli MVP, precedente alla CTP6. Nella CTP5 le istruzioni utilizzate, in particolare le stored procedure per abilitare il CDC, erano diverse e non posso assicurare che il codice riportato in questo articolo funzioni con le versioni successive ed in particolare con la RTM. Sarà mia premura apportare tempestivamente le necessarie correzioni al codice, ma, qualora doveste ravvisare qualche anomalia prima di me, vi sarò grato se me la segnalerete.

Lo speciale completo su Visual Studio 2008, Windows Server 2008 e SQL Server 2008

3 pagine in totale: <<Indietro 1 2 [3]

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.

TUTORIALS
TOP TEN ARTICOLI
NOTIFICHE

Iscriviti alla nostra newsletter nuoviarticoli per ricevere e-mail le notifiche!

Indirizzo e-mail:
PROVIDER ASP.NET 2.0

Seleziona il database per avere il web.config pronto per Membership, Roles e Profile API.



IN EVIDENZA
MISC