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:
| Valore | Significato |
| 1 | DELETE |
| 2 | INSERT |
| 3 | UPDATE (è il record prima della modifica) |
| 4 | UPDATE (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
- .NET Framework 3.5 e Visual Studio 2008: cosa c'è di nuovo di Riccardo Golia
- Le novità di C# 3.0 e Visual Basic 9.0 attraverso LINQ di Stefano Mostarda
- Introduzione a LINQ, LINQ to XML, Object e DataSet di Stefano Mostarda

- Introduzione ad ASP.NET 3.5: novità e caratteristiche di Daniele Bochicchio
- Introduzione ad ASP.NET 3.5 di Daniele Bochicchio

- Le novità di Communication e Workflow Foundation e la loro cooperazione nel .NET Framework 3.5 di Cristian Civera
- Windows Presentation Foundation 3.5: 3D interattivo e le altre novità del framework di Marco Leoncini
- Utilizzare Visual Studio 2008 per semplificare lo sviluppo con LINQ to SQL di Andrea Zani
- Uno sguardo a LINQ to SQL di Stefano Mostarda

- Le nuove caratteristiche di IIS 7.0 per sviluppatori e sistemisti di Daniele Bochicchio, Christian Paparelli
- Gestire transazioni miste con NTFS in Windows Server 2008 di Ugo Lattanzi
- LINQ oltre SQL e XML: creare un provider per l'integrazione con Live Search di Alessandro Catorcini
- Tracciare le modifiche ai dati e allineare i datawarehouse con il Change Data Capture in SQL Server 2008 di Luca Bianchi
3 pagine in totale: <<Indietro 1 2 [3]
Contenuti dell'articolo
Per inserire un commento, devi registrarti alla nostra community.







Difficoltà
Utilità
Stampa
Download 


