SSIS - Guida operativa e all'ottimizzazione Articolo tecnico su SQL Server Autori: Alexei Khalyako, Carla Sabotta, Silvano Coriani, Sreedhar Pelluru, Steve Howard Revisori tecnici: Cindy Gross, David Pless, Mark Simms, Daniel Sol Data di pubblicazione: dicembre 2012 Contesto di applicazione: SQL Server 2012; database SQL di Windows Azure Riepilogo: SQL Server Integration Services (SSIS) può essere utilizzato come efficace strumento per spostare i dati da e verso il database SQL di Windows Azure, come parte della soluzione globale di estrazione, trasformazione e caricamento (ETL) e della soluzione di spostamento di dati, ed è ideale per spostare dati tra origini e destinazioni nel cloud e, in scenari ibridi, tra ambienti cloud e locali. In questo white paper vengono descritte le procedure consigliate per SSIS relative a origini e destinazioni cloud, viene illustrata la pianificazione di progetti SSIS da implementare completamente nel cloud o in ambienti ibridi di spostamento di dati e viene descritto un esempio di ottimizzazione delle prestazioni in uno spostamento ibrido tramite la scalabilità orizzontale dello spostamento dei dati. Copyright Il documento viene fornito "così com'è". Le informazioni e le opinioni espresse nel presente documento, inclusi gli URL e altri riferimenti a siti Web, possono essere soggette a modifiche senza preavviso. L'utente accetta di utilizzare tali informazioni a proprio rischio. Alcuni esempi raffigurati in questo documento sono forniti a scopo puramente illustrativo e sono fittizi. Nessuna associazione o connessione reale è intenzionale o può essere desunta. Il presente documento non implica la concessione di alcun diritto di proprietà intellettuale relativo ai prodotti Microsoft. È possibile copiare e utilizzare questo documento per fini di riferimento interno. © 2011 Microsoft. Tutti i diritti sono riservati. 2 Sommario Introduzione.................................................................................................................................................. 5 Progettazione ................................................................................................................................................ 5 Definizione e descrizione del problema .................................................................................................... 5 Perché lo spostamento dei dati è particolarmente complesso in Azure .................................................. 6 Scenari principali di spostamento dei dati ................................................................................................ 7 Caricamento iniziale dei dati e migrazione dall'ambiente locale al cloud ............................................ 7 Spostamento dei dati generati nel cloud sui sistemi locali ................................................................... 8 Spostamento di dati tra servizi cloud.................................................................................................... 9 Strumenti, servizi e soluzioni esistenti...................................................................................................... 9 SQL Server Integration Services (SSIS) ................................................................................................ 10 Classe SqlBulkCopy in ADO.NET .......................................................................................................... 11 Programma per la copia bulk (BCP.EXE) ............................................................................................. 12 BLOB e code di archiviazione di Windows Azure ................................................................................ 12 Scelte di progettazione e implementazione ........................................................................................... 13 Progettare e implementare un'architettura bilanciata ...................................................................... 13 Considerazioni sui tipi di dati .............................................................................................................. 15 Assemblaggio e distribuzione della soluzione ........................................................................................ 15 Creare soluzioni portatili ..................................................................................................................... 15 Distribuzione di pacchetti e componenti di codice............................................................................. 16 Database SQL di Windows Azure come destinazione dello spostamento dei dati............................. 16 Considerazioni sull'architettura .................................................................................................................. 17 Progettazione del riavvio senza perdita di avanzamento nella pipeline ................................................ 18 Il principio di base ................................................................................................................................... 18 Esempio con una singola destinazione ............................................................................................... 19 Esempio con più destinazioni ................................................................................................................. 25 Altri suggerimenti per il riavvio ............................................................................................................... 27 Progettazione della logica di ripetizione dei tentativi senza intervento manuale ................................. 28 Integrazione della ripetizione dei tentativi ............................................................................................. 29 3 Opzioni di ottimizzazione delle prestazioni di SSIS ..................................................................................... 33 Ottimizzazione delle impostazioni di rete............................................................................................... 33 Impostazioni di rete ............................................................................................................................ 34 Nota: quando si modificano le impostazioni della scheda di interfaccia di rete per utilizzare i frame jumbo, verificare che l'infrastruttura di rete supporti questo tipo di frame. Dimensioni di pacchetto ..................................................................................................................... 34 Impostazioni del pacchetto SSIS ............................................................................................................. 35 Considerazioni speciali per i dati BLOB ............................................................................................... 37 Utilizzo delle nuove funzionalità di SSIS 2012 per monitorare le prestazioni in un sistema distribuito .................................................................................................................................. 39 Registrare le statistiche sulle prestazioni............................................................................................ 40 Visualizzare le statistiche di esecuzione ............................................................................................. 41 Monitorare il flusso di dati .................................................................................................................. 47 Conclusione ................................................................................................................................................. 52 4 Introduzione SQL Server Integration Services (SSIS) è uno strumento efficace per spostare i dati da e verso il database SQL di Windows Azure, come parte della soluzione di estrazione, trasformazione e caricamento (ETL) completa e della soluzione di spostamento di dati in cui non sono necessarie trasformazioni. SSIS è utilizzabile con svariate origini e destinazioni, che possono trovarsi tutte nel cloud, tutte in un ambiente locale o combinate in una soluzione ibrida. In questo white paper vengono descritte le procedure consigliate per SSIS relative a origini e destinazioni cloud, viene illustrata la pianificazione di progetti SSIS da implementare completamente nel cloud o in ambienti ibridi di spostamento di dati e viene descritto un esempio di ottimizzazione delle prestazioni in uno spostamento ibrido tramite la scalabilità orizzontale dello spostamento dei dati. Progettazione I progetti per lo spostamento di dati tra archivi dati cloud e locali possono implicare diversi processi in svariate soluzioni. Le fasi sono spesso molteplici e complesse; ad esempio, il popolamento iniziale della destinazione con dati che possono provenire da altri sistemi o piattaforme, la manutenzione necessaria per ribilanciare i set di dati a fronte della variazione del numero delle partizioni e la necessità di continuare con periodiche operazioni bulk o di aggiornamento sui dati. I presupposti di progettazione e il progetto stesso di una soluzione che preveda la collocazione di dati nel cloud sono spesso diversi da quelli necessari nel caso di un tradizionale spostamento di dati che si svolge completamente in locale. Molte nozioni, esperienze e procedure sono comunque valide, ma è necessario introdurre delle modifiche che tengano conto delle differenze, ad esempio il fatto che, quando ci si sposta in un pool condiviso di risorse disponibili a livello commerciale, l'ambiente in uso non è più autonomo e completamente controllabile. Per ottenere risultati positivi, è necessario gestire queste differenze con un approccio più bilanciato e scalabile. Definizione e descrizione del problema Sia nel caso di soluzioni native create appositamente per il cloud che nel caso di soluzioni migrate, i dati devono essere spostati in un senso e nell'altro. La probabilità che questa esigenza si presenti in molte fasi del ciclo di vita delle applicazioni è elevata. Le fasi includono i test di preproduzione, il caricamento iniziale dei dati, la successiva sincronizzazione tra i dati generati nel cloud e i database locali originali e gli snapshot periodici di dati creati a partire dal cloud fino agli altri sistemi locali (ad esempio, i data warehouse). 5 Figura 1. Scenari di spostamento di dati Questa sezione è incentrata sulla fase di caricamento iniziale dei dati, cioè sull'esperienza end-to-end di estrazione dei dati dal database di origine, lo spostamento dall'ambiente locale al cloud e il caricamento dei dati in una destinazione finale. È importante sottolineare che la maggior parte delle procedure consigliate e delle ottimizzazioni (se non tutte) descritte in questo documento è valida per pressoché tutti gli scenari descritti, con modifiche minime. Questi scenari e le problematiche principali associate verranno trattati nelle sezioni successive. Perché lo spostamento dei dati è particolarmente complesso in Azure Rispetto a uno scenario di data center tradizionale, in cui gli aspetti più delicati dello spostamento dei dati tra applicazioni e sistemi sono in genere correlati a problemi quali la compatibilità delle applicazioni, l'orchestrazione e la sincronizzazione dei processi, le risorse hardware fisiche e le funzionalità di rete, ambienti cloud come Windows Azure prevedono ulteriori livelli di complessità. La complessità può riguardare aree come la connettività tra l'ambiente locale e il cloud o tra servizi cloud diversi e interessare affidabilità, larghezza di banda e latenza della connessione. La considerazione di questa complessità è un fattore cruciale nello sviluppo di una soluzione ottimale di spostamento dei dati. Quando la soluzione implica un numero elevato di parti in movimento, è ancora più importante che nella progettazione vengano giustamente bilanciati tutti i componenti e le tecnologie utilizzati, cercando di evitare il sovraccarico dei punti deboli del sistema, che ricadrebbe in modo negativo su tutti gli altri. 6 Sulla base dei test effettuati, una delle aree critiche è la capacità della destinazione dei dati di assorbire, alla velocità appropriata, la quantità di dati in arrivo dall'esterno. L'approccio più comune consiste nello scalare orizzontalmente il database di destinazione in più nodi di back-end con partizionamento orizzontale personalizzato (http://social.technet.microsoft.com/wiki/contents/articles/1926.how-to-shard-withwindows-azure-sql-database.aspx). Questa tecnica diventa obbligatoria se la quantità di dati da caricare è significativa (al momento della stesura di questo documento un volume di 20 GB all'ora è considerato significativo) e può essere applicata sia alle istanze del database di Azure che a SQL Server in esecuzione su Macchine virtuali di Windows Azure. Poiché questo metodo non introduce automaticamente la scalabilità lineare nella soluzione di caricamento dei dati, diventa più forte l'esigenza di bilanciare le altre parti mobili della soluzione. Nelle sezioni successive verranno descritte le aree più critiche e le opzioni di progettazione che possono essere adottate per ottimizzare i risultati finali. Scenari principali di spostamento dei dati Di seguito vengono descritti i tre scenari principali che verranno considerati come parte dell'esperienza globale di spostamento dei dati end-to-end. Tali scenari contengono la maggior parte dei temi e delle problematiche più ricorrenti. Caricamento iniziale dei dati e migrazione dall'ambiente locale al cloud Spostamento dei dati generati nel cloud sui sistemi locali Spostamento di dati tra servizi cloud Caricamento iniziale dei dati e migrazione dall'ambiente locale al cloud Database SQL o SQL Server in una macchina virtuale Figura 2. Scenario di caricamento iniziale dei dati 7 Per ogni applicazione da spostare da una distribuzione locale a un ambiente cloud è necessario spostare anche un certo volume di dati. Quando il volume di dati diventa significativo, questa operazione può presentare problematiche serie che richiedono un approccio leggermente diverso rispetto a uno scenario interamente locale, principalmente a causa di due aspetti: la larghezza di banda e la latenza della rete pubblica e la quantità di risorse (condivise) necessarie per la fase di caricamento dei dati, disponibili nei nodi hardware fisici che ospitano un database (database SQL di Azure o Macchine virtuali di Windows Azure) nell'ambiente cloud. Esistono approcci specifici (vedere la figura 2): ad esempio, il partizionamento dei dati originali in più file bucket e la compressione di questi file prima del trasferimento in rete possono ridurre l'impatto del componente a più basse prestazioni della soluzione globale. Il partizionamento dei dati è utile anche sul lato cloud perché favorisce l'inserimento dei dati in una destinazione che molto probabilmente verrà partizionata in modo orizzontale tra più istanze di database SQL di Azure o ospitata da più Macchine virtuali di Windows Azure. Il ruolo di SSIS per l'esecuzione fisica delle operazioni di importazione ed esportazione è sostanziale sia a livello locale che a livello di cloud. La soluzione globale richiederà altre tecnologie come l'archiviazione BLOB e le code di Windows Azure per archiviare i formati di file intermedi e per orchestrare la copia e recuperare l'operazione su più istanze dei processi di importazione di SSIS. Per ulteriori informazioni strettamente correlate alla migrazione dello schema e degli oggetti di database in un database SQL di Azure, vedere Migrazione di applicazioni incentrate sui dati a Windows Azure (http://msdn.microsoft.com/it-it/library/windowsazure/jj156154.aspx). Spostamento dei dati generati nel cloud sui sistemi locali Questo scenario è una variante molto simile dello scenario precedente, perché da un punto di vista tecnico prevede l'inversione del processo di caricamento e del flusso di dati, ma presenta anche qualche differenza riguardo agli obiettivi complessivi. Lo scenario è tipicamente associato ai dati generati a freddo che devono essere periodicamente recuperati e caricati in sistemi locali, come i data warehouse, o ai dati necessari per soluzioni transazionali locali. Di conseguenza, la maggior parte delle tecniche e delle tecnologie indicate nella sezione precedente è valida anche questo scenario. Tramite SSIS i dati sul lato cloud vengono estratti, quindi compressi e inviati a un sistema locale, cui si applicheranno tutte le linee guida tradizionali. Per ulteriori informazioni, vedere la Guida all'ottimizzazione delle prestazioni di caricamento dei dati (http://msdn.microsoft.com/it-it/library/dd425070(v=SQL.100).aspx). 8 Spostamento di dati tra servizi cloud In diversi scenari è necessario spostare i dati tra diversi servizi cloud e database. Tra questi sono inclusi il caso in cui i dati vengono scambiati tra soluzioni diverse che devono interagire e quello in cui i dati partizionati vengono ridistribuiti tra tabelle ospitate in partizioni diverse, come illustrato nella figura 3 di seguito. Figura 3. Spostamento di dati tra partizioni di database Database SQL o SQL Server in una macchina virtuale Le partizioni possono essere ugualmente ospitate da istanze di database SQL di Azure o SQL Server in un macchina virtuale di Windows Azure senza che cambino l'approccio e l'architettura sottostanti. A differenza degli scenari precedenti, l'intero processo di spostamento dei dati avviene in genere nei limiti di un'unica area di Windows Azure, riducendo notevolmente l'impatto della latenza di rete ed eliminando la necessità di esportare e importare dati utilizzando un percorso di archiviazione intermedio (dischi locali o archiviazione di Azure). Esistono alcuni scenari in cui può essere necessario spostare i dati tra aree diverse, ma questi casi non rientrano nell'ambito di trattazione di questo documento. Allo stesso tempo, poiché l'origine e la destinazione dei dati si trovano entrambe in un ambiente cloud condiviso, diventa molto più importante ottimizzare con precisione proprio la fase di caricamento. Strumenti, servizi e soluzioni esistenti Per implementare soluzioni per gli scenari descritti in precedenza, è possibile utilizzare una combinazione di strumenti nuovi ed esistenti e di componenti e approcci utilizzabili sia in locale che nel cloud. In un ambiente ibrido alcuni di questi componenti dovranno essere posizionati con i sistemi e le origini dati esistenti nell'ambiente locale, mentre altri risulteranno particolarmente efficienti se posizionati con le destinazioni dei dati nel cloud. 9 SQL Server Integration Services (SSIS) Come soluzione primaria di spostamento e integrazione dei dati, SSIS offre una vasta gamma di funzionalità per la gestione della maggior parte delle aree previste negli scenari trattati. Pur non appositamente progettati per l'ambiente ibrido, con l'avvento di Macchine virtuali di Windows Azure i pacchetti SSIS possono essere eseguiti sia in ambienti locali che nel cloud e possono virtualmente collegare i due mondi in modo diretto. Questa è una grande opportunità di riutilizzo delle conoscenze e delle competenze della community di sviluppo DBA/ETL, che vanta numerosi professionisti formati ed esperti in tale tecnologia. Tuttavia è importante sottolineare che non tutti i processi ETL implementati con SSIS possono essere riutilizzati direttamente nello spostamento di dati da un ambiente locale al cloud. A seconda della complessità del processo, del volume e della velocità dei dati e delle differenze intrinseche tra le destinazioni dei dati basate su cloud, come SQL Server in esecuzione su un macchina virtuale di Windows Azure e il database SQL di Azure, si impongono alcune modifiche architetturali. Alcune di queste problematiche possono riguardare l'attuale mancanza di capacità nella gestione degli aspetti di connettività a realtà cloud come il database SQL di Windows Azure o la mole di lavoro richiesta per progettare pacchetti SSIS in grado di gestire errori e tentativi ripetuti durante i processi di caricamento dei dati. Un'altra problematica può essere individuata nella necessità di progettare pacchetti che devono connettersi a destinazioni di dati partizionate, in cui le entità di database possono essere distribuite su un numero di nodi fisici che può cambiare nel tempo. La logica e i metadati di partizionamento devono essere gestiti e recuperati dai file di configurazione o dalle strutture di dati delle applicazioni. La piattaforma SSIS include già la maggior parte delle funzionalità in grado di gestire tali problematiche. Ad esempio, è possibile utilizzare i componenti del flusso di dati quali le trasformazioni Suddivisione condizionale e Multicast per implementare la logica di partizionamento. Nell'affrontare le problematiche architetturali, l'implementazione pratica della nuova progettazione, relativamente più impegnativa, può essere attuata adottando il tradizionale approccio degli strumenti visivi o un metodo più orientato all'automazione e alla programmazione per costruire una soluzione più complessa. Per l'approccio a livello di programmazione, SSIS offre un ambiente completamente gestibile tramite script per un'ampia gamma di operazioni, dalla creazione di attività personalizzate nella pipeline di trasformazione alla strumentazione per facilitare la risoluzione dei problemi e il debug dell'esecuzione dei pacchetti. La versione SQL Server 2012 di Integration Services include una soluzione completa di monitoraggio e gestione basata su un catalogo comune, che può facilitare la progettazione di una soluzione distribuita di spostamento dei dati e la raccolta di statistiche e risultati dell'esecuzione dei pacchetti. 10 Classe SqlBulkCopy in ADO.NET Se si opta per lo sviluppo di una soluzione personalizzata per risolvere un problema specifico di spostamento dei dati, la classe SqlBulkCopy (http://msdn.microsoft.com/it-it/library/system.data.sqlclient.sqlbulkcopy.aspx) contenuta nella libreria di accesso ai dati ADO.NET è probabilmente uno degli strumenti più comuni da utilizzare allo scopo. Concepita come semplice wrapper delle API per la copia bulk ODBC, questa classe accetta come input una tabella di dati e una connessione al database esistente e consente di caricare dati in SQL Server o in un database SQL di Azure in modo rapido e completamente configurabile. Un aspetto importante dell'utilizzo della classe SqlBulkCopy per interagire con una destinazione di dati basata sul cloud è la possibilità di sostituire facilmente la tradizionale classe SqlConnection (http://msdn.microsoft.com/it-it/library/system.data.sqlclient.sqlconnection.aspx) utilizzata per interagire con il server con la più appropriata classe ReliableSqlConnection (http://msdn.microsoft.com/it-it/library/microsoft.practices.enterpriselibrary.windowsazure. transientfaulthandling.sqlazure.reliablesqlconnection(v=pandp.50).aspx), che fa parte della libreria del blocco di applicazioni per la gestione degli errori temporanei (http://msdn.microsoft.com/itit/library/hh680934(v=PandP.50).aspx). Ciò semplifica notevolmente l'implementazione di un meccanismo di logica di ripetizione dei tentativi in un processo di caricamento di dati nuovo o esistente. Un altro interessante aspetto della libreria sta nella capacità di fornire criteri di ripetizione dei tentativi, sia standard che personalizzati, da adattare facilmente alle diverse condizioni di connettività. La classe SqlBulkCopy espone tutti gli attributi e le proprietà necessari per adattare il processo di caricamento a quasi tutte le condizioni. In questo articolo viene spiegato come ottimizzare le dimensioni dei batch a seconda della posizione di esecuzione del processo di caricamento dei dati, della quantità di dati che il processo deve importare e del tipo di connettività disponibile tra il processo e la destinazione dei dati. Una situazione in cui la classe SqlBulkCopy non costituisce la scelta più pratica per caricare dati in una destinazione si verifica quando la quantità di dati in un singolo batch è molto bassa, ad esempio tra 10 e 1000 righe. In questo caso, l'overhead richiesto dalla classe SqlBulkCopy per il controllo iniziale dei metadati prima del caricamento dei dati può influire sulle prestazioni complessive. Una valida alternativa per i batch di piccole dimensioni consiste nel definire un parametro con valori di tabella (TVP) che implementi lo schema desiderato, utilizzando “INSERT INTO Destination SELECT * FROM @TVP” per caricare i dati. Per un esempio completo dell'utilizzo dell'API per la copia bulk, vedere la classe SqlBulkCopy (http://msdn.microsoft.com/it-it/library/system.data.sqlclient.sqlbulkcopy.aspx). 11 Programma per la copia bulk (BCP.EXE) Il programma per la copia bulk (utilità della riga di comando creata in base alle stesse API per la copia bulk descritte per la classe SqlBulkCopy) viene utilizzato da qualche tempo per il caricamento bulk dei dati da e verso un'istanza di SQL Server. Il programma è uno strumento semplice ma potente che consente di automatizzare con efficienza le soluzioni di spostamento di dati semplici. Uno dei principali vantaggi dello strumento consiste nella semplicità con cui è possibile automatizzarne l'installazione nei nodi di calcolo o in Macchine virtuali di Windows Azure e utilizzare gli script esistenti, adattabili all'esecuzione in un ambiente cloud. D'altra parte, BCP.EXE non offre funzionalità avanzate per la gestione delle connessioni. Inoltre, BCP.EXE è impegnativo come SSIS per quanto riguarda l'implementazione di attività affidabili di spostamento dei dati basate su operazioni di ripetizione dei tentativi che possono provocare instabilità e perdita di connessione. In più, a differenza degli altri strumenti citati, con BCP.EXE è necessario importare o esportare i dati da file fisici ospitati in un'unità locale, mappata o collegata. In questo modo diventa impossibile inviare il flusso di dati direttamente dall'origine alla destinazione o leggere i dati a livello di codice da origini diverse, come è invece possibile fare con SSIS o un'applicazione basata su SqlBulkCopy. BLOB e code di archiviazione di Windows Azure Per quanto non strettamente correlate allo spostamento dei dati, le funzionalità di archiviazione di Windows Azure sono senza dubbio parte integrante dell'implementazione di soluzioni complesse che richiedono un'archiviazione intermedia tra processi locali e cloud, nonché elemento essenziale per l'orchestrazione di fasi e operazioni tra i due ambienti. I BLOB di archiviazione di Windows Azure rappresentano un potente meccanismo di archiviazione per caricare file intermedi e per scambiarli tra nodi di calcolo o Macchine virtuali di Windows Azure e le applicazioni in esecuzione in locale. Le code di archiviazione di Windows Azure sono un semplice strumento di messaggistica che permette di segnalare e coordinare l'accesso ai file e ai contenuti archiviati come BLOB di Windows Azure dai processi di caricamento dei dati. I BLOB e le code di archiviazione di Windows Azure si integrano facilmente con le applicazioni esistenti, grazie alla libreria client di archiviazione di Azure .NET che offre un semplice set di classi per interagire con gli account di archiviazione, il contenitore, i BLOB e le operazioni correlate. Questa libreria nasconde i dettagli dell'interfaccia basata su REST sottostante e funge da ponte tra i dati locali e i dati del cloud. Per ulteriori informazioni sull'uso delle code e dei BLOB di archiviazione di Windows Azure, vedere le pagine relative alla modalità di utilizzo del servizio di archiviazione nelle code (http://www.windowsazure.com/en-us/develop/net/how-to-guides/queue-service/) e alla modalità di utilizzo del servizio di archiviazione BLOB di Windows Azure in .NET (http://www.windowsazure.com/ en-us/develop/net/how-to-guides/blob-storage/). 12 Scelte di progettazione e implementazione Diversi fattori possono influire sulle scelte di progettazione e implementazione per le soluzioni ibride di spostamento dei dati. La necessità di riutilizzare elementi e processi esistenti anziché iniziare da un progetto completamente nuovo è probabilmente il fattore di maggiore impatto sulle decisioni architetturali, seguito dall'insieme di competenze e dai profili dei membri del team a disposizione (se, ad esempio, il numero di sviluppatori supera il numero di amministratori di database). Valutare se il team disponga delle competenze per creare una soluzione totalmente personalizzata a livello di codice o per adattare i processi ETL esistenti. In entrambi i casi, introducendo il cloud nella progettazione è necessario tenere presenti alcune considerazioni, poiché alcuni dei più ovvi presupposti alla base del funzionamento dei tradizionali ambienti locali potrebbero non avere alcuna validità in un ambiente cloud. Un altro aspetto importante della progettazione riguarda la posizione in cui collocare ed eseguire specifiche attività e servizi di spostamento dei dati, ad esempio la logica di suddivisione condizionale in base alla quale vengono eseguite le attività di partizionamento orizzontale o di compressione dei dati. Il modo in cui queste attività vengono implementate a livello di componente (pipeline SSIS o attività personalizzate) può determinare un utilizzo molto intenso della CPU da parte di tali componenti. Per bilanciare l'utilizzo delle risorse, può essere consigliabile spostare le attività in Macchine virtuali di Windows Azure e sfruttare la naturale elasticità dell'ambiente cloud. Allo stesso tempo, la vicinanza alle origini dati su cui le risorse opereranno potrebbe risultare ancora più vantaggiosa a causa della riduzione della latenza di rete, che può rivelarsi un fattore decisamente critico per questo tipo di soluzione. La pianificazione e i test consentono di individuare i colli di bottiglia nelle risorse e facilitano le decisioni relative all'implementazione delle varie attività. Il lavoro richiesto per implementare o adattare una soluzione esistente in uno scenario ibrido deve essere giustificato dai vantaggi che lo scenario ibrido può assicurare. È necessario chiarire i vantaggi tecnici che verranno ottenuti spostando alcune parti della soluzione nel cloud rispetto ai corrispondenti svantaggi, in modo da adottare il giusto approccio e implementare una soluzione ibrida di successo. Le scelte di compromesso sono collegate ad aspetti molto tangibili della progettazione di una soluzione. Come sfruttare le eccellenti funzionalità di scalabilità orizzontale fornite dalle piattaforme cloud senza cedere troppo controllo sui componenti della soluzione? Come eseguire i processi di caricamento dei dati su una piattaforma progettata per la scalabilità orizzontale anziché verticale e ottenere comunque prestazioni sufficientemente prevedibili? Per rispondere a queste domande è necessario dimenticare alcuni presupposti relativi alle prestazioni e all'affidabilità della connettività di rete e alla regolare disponibilità di componenti e servizi applicativi e pianificare invece la possibilità di aggiungere risorse per risolvere i problemi legati alle prestazioni. L'approccio corretto implica una progettazione che preveda situazioni di errore, un valore di latenza normalmente più alto rispetto agli ambienti tradizionali e la possibilità di partizionare un carico di lavoro su molte macchine virtuali o servizi di piccole dimensioni. Progettare e implementare un'architettura bilanciata Le considerazioni precedenti dovrebbero indicare la giusta direzione verso la progettazione di una soluzione di spostamento di dati complessa, con più parti mobili, nessuna delle quali rappresenta necessariamente l'equivalente ottimale dei tradizionali componenti locali. 13 Il principio a cui ispirarsi è questo: suddividere il processo di spostamento dei dati in più parti di dimensioni inferiori, dall'estrazione dall'origine dati al caricamento nella destinazione, che devono avvenire in modo asincrono e orchestrato per adeguarsi all'ambiente a più elevata latenza introdotto dalla soluzione ibrida. La ricerca del giusto equilibrio tra tutti i componenti di un ambiente è molto più importante del raggiungimento dei limiti di un singolo componente. Anche i singoli passaggi del processo, ad esempio il caricamento dei dati, potrebbero richiedere il partizionamento in flussi di caricamento più piccoli inviati a partizioni o database fisici diversi per superare i limiti di un singolo nodo di back-end nell'architettura del database SQL di Windows Azure. Data la natura condivisa, multi-tenant e a disponibilità elevata di alcuni componenti del sistema (i nodi del database SQL di Windows Azure e il repository dei BLOB di archiviazione di Windows Azure di una macchina virtuale di Windows Azure che ospita SQL Server), il tentativo di inserire troppi dati in un singolo nodo potrebbe provocare ulteriori problemi di prestazioni. Un problema di prestazioni può essere ad esempio il sovraccarico del meccanismo di replica, che provoca il rallentamento dell'intero processo di caricamento dei dati. Figura 4. Rappresentazione schematica di un'architettura di caricamento dei dati bilanciata 14 Considerazioni sui tipi di dati Lo schema di database, la progettazione delle entità e i tipi di dati utilizzati possono influire sul processo di spostamento dei dati in vari modi. In generale, i tipi di dati più comprimibili possono offrire diversi vantaggi per il caricamento bulk dei dati dalle rispettive origini in BLOB di Windows Azure o in risorse di archiviazione locale per le operazioni temporanee. Naturalmente la compressione dei dati prima del trasferimento in rete migliora le prestazioni. Assemblaggio e distribuzione della soluzione L'implementazione e la distribuzione di una soluzione che include data center locali e ambienti basati su cloud richiedono in genere l'utilizzo di diversi componenti e servizi. Se l'intento è quello di distribuire più istanze della soluzione di spostamento dei dati, assume particolare importanza assicurare un elevato livello di automazione alle fasi di distribuzione e configurazione di tutte queste parti. Le tecnologie di virtualizzazione possono facilitare la creazione di un'immagine master, che può essere utilizzata sia in locale che nell'infrastruttura Macchine virtuali di Windows Azure per semplificare la distribuzione di servizi comuni, la cui presenza è necessaria in entrambi gli ambienti. Allo stesso tempo, l'utilizzo di Macchine virtuali di Windows Azure pone alcuni limiti rispetto alle possibilità offerte da altri nodi di calcolo di Windows Azure, come i ruoli Web e i ruoli di lavoro, in termini di applicazione e di pacchetti e servizi correlati (basti pensare, ad esempio, alle attività di avvio). Se si stanno già sfruttando funzionalità di distribuzione software, ad esempio quelle disponibili tramite le famiglie di prodotti Windows Server e System Center, un'altra possibilità consiste nel distribuire i componenti e i pacchetti della soluzione in modo che alcuni componenti vengano eseguiti nel cloud e altri negli ambienti locali. Un'ulteriore possibilità consiste nell'installare e configurare manualmente i vari componenti della soluzione, quali SSIS e Windows Azure SDK (per accedere alle funzionalità di archiviazione di Windows Azure), nonché tutti i pacchetti di installazione dell'applicazione (con estensione msi) necessari in ogni macchina virtuale eseguita come parte dell'ambiente distribuito. Creare soluzioni portatili Un aspetto che diventa particolarmente importante quando si esegue una soluzione in un'architettura a scalabilità orizzontale è la possibilità di riconfigurare rapidamente opzioni come le stringhe di connessione, le credenziali e tutte le altre opzioni di configurazione che includerà la soluzione. Questo richiede in genere un meccanismo di configurazione centralizzato di qualche tipo, che renda possibile l'accesso alle informazioni e la loro propagazione a tutti i vari componenti e servizi inclusi nel processo di spostamento dei dati, in modo che ogni modifica implichi il minimo sforzo. Adottando questo approccio è possibile implementare strumenti standard come SSIS e componenti e applicazioni sviluppati in modo personalizzato. L'archiviazione di Windows Azure può costituire una scelta valida per salvare e gestire le informazioni di configurazione, in quanto è facilmente accessibile e disponibile ai componenti locali e del cloud. 15 Vale la pena notare che la piattaforma SSIS include già diverse funzionalità che semplificano la portabilità e la scalabilità di una soluzione, come file e parametri di configurazione. Processi e servizi aggiuntivi che compongono la soluzione di spostamento di dati end-to-end possono implementare gli stessi tipi di approcci configurabili, semplificando il passaggio della soluzione tra ambienti diversi. Distribuzione di pacchetti e componenti di codice Una volta implementati tutti gli elementi della soluzione, la scelta del processo per distribuire fisicamente i vari pacchetti SSIS e i componenti di codice in più computer diventa fondamentale. Un altro aspetto ancora più importante sta nel modo in cui i pacchetti e gli elementi di codice verranno ospitati ed eseguiti nei vari server e macchine virtuali. Anche se l'ambiente nativo SSIS in SQL Server 2012 offre diversi tipi di archiviazione e modelli di distribuzione dei pacchetti, lo sviluppo di una soluzione di spostamento di dati end-to-end può comportare scelte diverse. Se l'esigenza è eseguire servizi o applicazioni di orchestrazione per la supervisione e il controllo del processo di spostamento dei dati, è necessario valutare come implementarli e in che misura utilizzare l'infrastruttura SSIS sottostante. Un esempio specifico della distribuzione e del coordinamento dei componenti è disponibile nel white paper sul ruolo di SQL Server 2012 SSIS nello spostamento di dati ibridi e Windows Azure, disponibile in MSDN Library nel nodo dedicato ai white paper Microsoft per SQL Server 2012. Macchine virtuali di Windows Azure e i server fisici basati su Windows Server non implementano tutte le funzionalità fornite dalla piattaforma Windows Azure per i ruoli di lavoro e i ruoli Web. Per questo motivo, la scelta migliore consiste nell'implementare tali componenti come servizi Windows, per assicurarsi che i processi vengano avviati contemporaneamente ai vari host e che continuino a essere eseguiti indipendentemente dalla sessione utente interattiva nel computer specifico. La piattaforma .NET facilita la creazione e l'assemblaggio di questo tipo di pacchetto software che può quindi essere distribuito sui vari host utilizzando le opzioni descritte in precedenza. I servizi e le applicazioni di orchestrazione interagiscono con i vari componenti esterni (code, archiviazione BLOB di Windows Azure e così via), richiamano il motore di esecuzione SSIS (DtExec.exe) e orchestrano le attività di caricamento e trasformazione dei dati su più host o macchine virtuali. Anche i componenti personalizzati necessari per l'esecuzione del pacchetto dovranno essere distribuiti su più nodi. Seguendo questo approccio distribuito è possibile creare un ambiente di distribuzione ed esecuzione affidabile, portatile e flessibile per ospitare la soluzione end-to-end di spostamento dei dati in un'infrastruttura completamente ibrida. Database SQL di Windows Azure come destinazione dello spostamento dei dati Benché SQL Server e i database SQL di Windows Azure presentino caratteristiche simili, è errato ritenerli identici. Esistono alcune differenze che possono influire sul modo in cui le applicazioni vengono eseguite nel database SQL di Windows Azure rispetto al database SQL Server. 16 Il database SQL di Windows Azure è un servizio ospitato in cui viene implementata un'architettura multi-tenant completa. A differenza delle implementazioni tradizionali di SQL Server, il database SQL di Windows Azure include funzionalità quali la disponibilità elevata (HA) incorporata e i backup automatici e può essere eseguito su hardware di largo consumo anziché in server di grandi dimensioni. Nel database viene eseguito un subset delle funzionalità normalmente utilizzate negli ambienti locali, tra cui la compressione del database, le query parallele, gli indici columnstore, il partizionamento delle tabelle e così via. Per ulteriori informazioni sui limiti delle funzionalità del database SQL di Windows Azure, vedere Limitazioni delle funzionalità di SQL Server (database SQL di Windows Azure) (http://msdn.microsoft.com/it-it/library/windowsazure/ff394115.aspx). Una delle principali differenze tra il database SQL di Windows Azure e SQL Server consiste nel fatto che il database SQL di Windows Azure espone un servizio multi-tenant a scalabilità orizzontale, nel quale diverse sottoscrizioni condividono le risorse di uno o più computer in un data center Microsoft. L'obiettivo è quello di bilanciare il carico globale nel data center spostando occasionalmente i clienti da un computer all'altro. Tali computer sono server standard basati su rack che consentono di ottimizzare il rapporto prezzo/prestazioni piuttosto che le prestazioni complessive. Non tutti i nodi del database SQL di Windows Azure utilizzano hardware di fascia molto alta nella soluzione ospitata. Quando supera i limiti di un singolo computer, l'applicazione di un cliente deve essere modificata in modo da distribuire il carico di lavoro su più database (spesso, cioè, su più computer) anziché in un singolo server. Uno degli svantaggi della flessibilità e della facilità di gestione di questo ambiente è che talvolta l'applicazione può passare a un altro computer in modo imprevisto. Poiché le sessioni sono indipendenti dallo stato, nella progettazione dell'applicazione vanno utilizzate tecniche che evitano singoli punti di errore, inclusi la memorizzazione nella cache in altri livelli, nei casi appropriato, e l'uso della logica di ripetizione dei tentativi per connessioni e comandi ai fini della resilienza agli errori. Inoltre, poiché i vari livelli dell'infrastruttura di Windows Azure non si trovano nella stessa subnet di rete, si verificano alcune piccole differenze di latenza tra le applicazioni client e il database SQL di Windows Azure. Lo stesso vale nei casi in cui le applicazioni e il database sono ospitati nello stesso data center fisico. Le tradizionali soluzioni SQL Server di caricamento di dati caratterizzate da un elevato traffico di rete possono risultare più lente in Windows Azure a causa di queste differenze nella rete fisica. Chi ha familiarità con i primi modelli di elaborazione client-server potrà adottare le stesse soluzioni, valutando attentamente i round trip tra i livelli di una soluzione per gestire tutte le evidenti differenze di latenza. Considerazioni sull'architettura Alcune delle problematiche più comuni legate ai pacchetti SSIS riguardano le modalità di gestione degli errori imprevisti nel corso dell'esecuzione e quelle di riduzione del tempo richiesto per completare un processo ETL quando è necessario riprendere l'elaborazione dopo un errore. Per le attività del flusso di controllo, come le attività del file system, è possibile utilizzare checkpoint per riprendere l'esecuzione senza rielaborare le operazioni già completate. Per istruzioni dettagliate sull'utilizzo dei checkpoint, vedere Riavvio dei pacchetti tramite checkpoint (http://msdn.microsoft.com/it-it/library/ms140226.aspx). 17 Spesso il flusso di dati è la parte di maggiori dimensioni del pacchetto SSIS. In questa sezione vengono illustrate le strategie per progettare i pacchetti in modo da prevedere la ripetizione automatica dei tentativi in caso di errore, nonché progettare la pipeline del flusso di dati in modo da riprendere le attività a partire dal punto di errore anziché riprovare l'intero flusso di dati. Ulteriori considerazioni per la gestione degli errori temporanei sulla piattaforma di Windows Azure sono contenute nel white paper sul ruolo di SQL Server 2012 SSIS nello spostamento di dati ibridi e Windows Azure, disponibile in MSDN Library nel nodo dedicato ai white paper Microsoft per SQL Server 2012. Progettazione del riavvio senza perdita di avanzamento nella pipeline Un aspetto critico della progettazione dei pacchetti riguarda la capacità di configurare il pacchetto in modo che, in caso di errore, le operazioni del pacchetto eseguite fino a quel punto non vadano perdute. Per gli elementi del flusso di controllo di un pacchetto questo scopo viene raggiunto tramite l'utilizzo dei checkpoint. Tuttavia, la capacità di riavviare un flusso di dati senza perdita di avanzamento dipende esclusivamente dalla progettazione del pacchetto. In questa sezione viene illustrata una strategia per la progettazione dei pacchetti che consente il riavvio del flusso di dati dal punto di errore e la ripetizione automatica dei tentativi in modo che l'esecuzione del pacchetto non venga interrotta con esito negativo in caso di perdita della connessione. La previsione di tali perdite o brevi interruzioni della connessione nella progettazione è particolarmente importante quando si spostano dati da o verso il database SQL di Windows Azure. Il principio di base Sebbene le prestazioni siano importanti in qualsiasi spostamento di dati, è necessario bilanciare le esigenze di prestazioni con la quantità di lavoro che ci si può permettere di perdere se si verificano imprevisti nel corso dello spostamento. In ogni spostamento di dati è necessario saper determinare esattamente quali dati sono già arrivati a destinazione e quali no. Nel caso di dati che vengono solo inseriti, questa informazione può essere spesso determinata tramite la sola chiave primaria. Per altri dati, è possibile basarsi sulla data dell'ultima modifica. Qualsiasi sia la natura dei dati, nella prima parte della progettazione del riavvio è necessario definire il modo in cui identificare i dati già presenti nella destinazione, i dati da aggiornare nella destinazione e i dati ancora da spostare nella destinazione. Stabilito ciò, è possibile segmentare e ordinare i dati in modo tale da elaborare solo quelli non ancora giunti a destinazione o da ridurre al minimo la quantità di rielaborazione necessaria in ciascuna fase. La divisione in blocchi e l'ordinamento permettono di tenere traccia facilmente dei blocchi già elaborati e, all'interno dei blocchi, dei record già elaborati. Adottando questo approccio non è necessario confrontare ogni riga di origine con la destinazione per determinare se il record è stato elaborato. I processi ETL più complessi possono prevedere diversi ambienti di gestione temporanea, ciascuno dei quali è una destinazione per una fase del processo. In questo tipo di scenari, considerare ognuno degli ambienti di gestione temporanea una destinazione distinta e progettare il riavvio di ogni segmento del processo ETL. 18 Esempio con una singola destinazione Il flusso di dati riavviabile più semplice ha piccole dimensioni e un singolo Integer come chiave primaria. Quando SQL Server è l'origine, è possibile eseguire una query su questa origine utilizzando la procedura consigliata di limitare i dati estratti dall'origine. Si consideri la classica tabella di esempio di AdventureWorks: "Production.TransactionHistory". La tabella presenta la struttura seguente: CREATE TABLE [Production].[TransactionHistory] ( [TransactionID] INT [ProductID] INT [ReferenceOrderID] INT [ReferenceOrderLineID] INT [TransactionDate] INT [TransactionType] NCHAR(1) [Quantity] INT [ActualCost] MONEY [ModifiedDate] DATETIME ) NOT NOT NOT NOT NOT NOT NOT NOT NOT NULL NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, PRIMARY KEY, In questo esempio la tabella ha un singolo Integer come chiave primaria. Se al momento dello spostamento i dati sono statici o vengono solo inseriti in questa tabella (senza aggiornamenti), è sufficiente la chiave primaria per determinare se una riga è stata inserita nella destinazione. Il confronto di ogni valore di chiave primaria con la destinazione è relativamente costoso. È consigliabile invece utilizzare una strategia di ordinamento dei dati nel file di origine in base alla colonna TransactionID. Con questa strategia, le uniche informazioni necessarie sono se i dati vengano o meno elaborati in ordine e quale sia il TransactionID più alto di cui è stato eseguito il commit nella destinazione. In un pacchetto SSIS questo scopo può essere ottenuto effettuando le operazioni seguenti. 1. Controllare la chiave più alta nella destinazione. 2. Compilare la query dall'origine per estrarre solo i record con un TransactionID maggiore del TransactionID più alto nella destinazione. 3. Utilizzare un'istruzione ORDER BY TransactionID nella query di origine per assicurarsi che il confronto con il TransactionID più alto rimanga valido al successivo avvio del pacchetto. In SSIS, utilizzando un'origine dati relazionale come origine, è possibile utilizzare un'attività Esegui SQL per estrarre il valore più alto in una variabile nel pacchetto. Prevedere però l'eventualità che nella destinazione non sia presente alcuna riga. SELECT MAX(TransactionID) FROM Production.TransactionHistory Per recuperare il valore massimo di TransactionID, tenere presente che il risultato di una tabella vuota è null. Ciò può comportare alcuni problemi nella logica utilizzata nel pacchetto. Un approccio migliore consiste innanzitutto nell'utilizzare un'attività Esegui SQL nell'origine e cercare il valore minimo non elaborato di TransactionID nell'origine. Quindi, eseguire la query per determinare il valore massimo di TransactionID nella destinazione o, se non esiste, utilizzare un valore inferiore al TransactionID minimo dell'origine. Compilare la query di origine per estrarre solo i record maggiori di tale valore, senza dimenticare di includere ORDER BY TransactionID. 19 NOTA: a livello logico si ottengono gli stessi risultati semplicemente recuperando un valore dalla destinazione e utilizzando una funzione ISNULL o l'istruzione CASE nella clausola WHERE della query di origine, ma questo modo di procedere può causare problemi di prestazioni, soprattutto quando le query di origine sono piuttosto complesse. Evitare di utilizzare questo metodo e trovare invece un valore da utilizzare con sicurezza come limite inferiore, quindi compilare la query di origine usando questo valore. NOTA: quando l'origine è SQL Server, l'uso di una clausola ORDER BY su un indice cluster non provoca attività di elaborazione supplementari per l'ordinamento. I dati sono già ordinati in modo da poter essere recuperati senza eseguire un'istruzione SORT. Se anche i dati nella destinazione dispongono di un indice cluster nella stessa colonna, l'ordinamento nell'origine ottimizza la query di origine e gli inserimenti nella destinazione. Inoltre, assicura l'ordine all'interno della pipeline SSIS, consentendo pertanto il riavvio del flusso di dati dal punto di errore. Per compilare questo pacchetto di esempio, effettuare le operazioni seguenti. 1. Creare un nuovo pacchetto in un progetto nuovo o esistente. Rinominare il pacchetto "SimpleRestart". 2. Creare gestioni connessioni per connettersi all'origine e alla destinazione. Per questo esempio viene creata una gestione connessione OLE DB sia per il server di origine che per il server di destinazione. 3. Trascinare una nuova attività Esegui SQL nell'area del flusso di controllo e rinominarla "Pull Min TransactionID From Source". 4. Creare una variabile SSIS a livello del pacchetto e denominarla minTransactionIDAtSource. Questa variabile verrà utilizzata per archiviare il valore estratto dall'attività Esegui SQL appena aggiunta. Verificare che il tipo di dati sia Int32, perché corrisponda al valore di TransactionID della tabella, e impostare un valore iniziale appropriato. 5. Configurare Pull Min TransactionID From Source come indicato di seguito. a. Modificare l'attività e impostare Connessione come gestione connessione per il server di origine. b. Sebbene sia possibile archiviare SQLStatement in una variabile, per questo esempio lasciare SQLSourceType impostato come Input diretto. Aprire la finestra di input per SQLStatement e immettere la query seguente: SELECT ISNULL(MIN(TransactionID), 0) FROM Production.TransactionHistory NOTA: testare le query SQL prima di immetterle negli editor di SSIS. Poiché non esiste una vera e propria Guida per il debug nelle finestre dell'editor di query SSIS, in questo modo si semplifica il debug. 20 Figura 5. Configurazione dell'attività Esegui SQL per trovare il valore minimo di TransactionID nell'origine. c. Chiudere la finestra Immetti query SQL facendo clic su OK. d. Impostare la proprietà ResultSet su Riga singola. e. Nel riquadro sinistro dell'editor attività Esegui SQL fare clic su Set dei risultati per configurare la modalità di acquisizione del valore dalla query. f. Fare clic sul pulsante Aggiungi per aggiungere un set dei risultati. g. Nel nuovo set dei risultati impostare Nome risultato su 0. Verificare che in Nome variabile venga visualizzato User::minTransactionIDAtSource (variabile creata nel passaggio 4). In questa variabile verrà archiviato il risultato della query SQL. h. Chiudere l'editor attività Esegui SQL. Non dovrebbero essere visualizzati errori sull'attività dopo la chiusura. 6. Trascinare un'altra attività Esegui SQL nell'area del flusso di controllo. Denominare l'attività Pull Max TransactionID from Destination. Connettere il vincolo di precedenza di esito positivo da Pull Min TransactionID From Source alla nuova attività. 7. Creare una nuova variabile con ambito a livello del pacchetto. Denominare la nuova variabile maxTransactionIDAtDestination. Assegnare alla variabile il tipo di dati Int32 in modo che corrisponda al tipo di dati di TransactionID e specificare un valore iniziale appropriato. 8. Aprire l'Editor attività Esegui SQL per la nuova attività ed effettuare le operazioni seguenti: a. Impostare la proprietà ResultSet su Riga singola. b. Impostare l'attività come gestione di connessione del server di destinazione. c. Impostare SQLSourceType come Input diretto. 21 d. Per SQLStatement utilizzare SELECT ISNULL(MAX(TransactionID), ?) FROM Production.TransactionHistory NOTA: ? è un parametro di query, il cui valore viene impostato temporaneamente. e. Chiudere l'editor di query facendo clic su OK, quindi scegliere Mapping parametri nel riquadro sinistro dell'Edtor attività Esegui SQL. f. Fare clic su Aggiungi per aggiungere un parametro singolo. i. Per Nome variabile scegliere User::minTransactionIDAtSource. ii. Per Direzione scegliere Input. iii. Il tipo di dati deve essere LONG, che in questo contesto corrisponde a un Integer a 32 bit. iv. Impostare Nome parametro su 0. Si noti che il nome del carattere deve essere modificato in 0, altrimenti verrà generato un errore. g. Fare clic su Set dei risultati nel riquadro sinistro. Fare clic sul pulsante Aggiungi per aggiungere un nuovo set dei risultati. i. Modificare Nome risultato in 0. ii. In Nome variabile scegliere User::maxTransactionIDAtDestination, ovvero la variabile creata nel passaggio 7. Questa variabile conterrà il risultato della query immessa dopo l'esecuzione di questa attività. NOTA: il passaggio successivo dipende dal tipo di origine utilizzato nel flusso di dati. Per un'origine OLE DB è possibile utilizzare una variabile SSIS che contiene un'istruzione SQL come query. Al contrario, è possibile parametrizzare una connessione ADO.NET in modo da utilizzare un parametro di pacchetto o di progetto come query di origine. In questo primo esempio verrà utilizzata un'origine OLE DB con una variabile che contiene la query di origine. 9. Trascinare un'attività Flusso di dati nell'area del flusso di controllo. Rinominarla in Main data move e connettere il vincolo di precedenza di esito positivo da Pull Max TransactionID From Destination all'attività Flusso di dati. Quando il pacchetto viene eseguito a questo punto, i valori che è necessario saper individuare per stabilire il punto di inizio dell'esecuzione corrente sono archiviati. È ora necessario impostare una variabile che contenga la query di origine SQL. 10. Creare una nuova variabile con ambito a livello del pacchetto. Denominare la variabile sourceQuery e impostare il tipo di dati su String. Utilizzare un'espressione per ottenere dinamicamente il valore della variabile in fase di esecuzione in base al valore determinato come punto iniziale della query, effettuando le operazioni seguenti: a. Fare clic sul pulsante con i puntini di sospensione a destra della colonna Espressione per visualizzare il Generatore di espressioni. b. Espandere il nodo Variabili e parametri nella finestra superiore sinistra del Generatore di espressioni. Utilizzare la variabile User::MaxTransactionIDAtDestination creata nel passaggio 7, che dovrebbe essere disponibile nell'elenco di variabili. Questa variabile è di tipo Int32, ma dovrà essere utilizzata come parte di una variabile di tipo String. A tale scopo, è necessario eseguirne il cast come tipo di dati DT_WSTR. Nel riquadro superiore destro espandere il nodo Cast di tipo per individuare il cast di tipo (DT_WSTR, <<lunghezza>>). 22 c. Digitare la query nel riquadro Espressione. Nei punti in cui è necessario inserire il nome della variabile o il cast di tipo è possibile trascinare l'elemento desiderato dalla finestra appropriata al riquadro Espressione. In questo modo si riduce il numero di errori di digitazione nell'editor. Creare l'espressione nel modo seguente: "SELECT TransactionID, ProductID, ReferenceOrderID, ReferenceOrderLineID, TransactionDate, TransactionType, Quantity, ActualCost, ModifiedDate FROM Production.TransactionHistory WHERE TransactionID > " + (DT_WSTR, 12 ) @[User::maxTransactionIDAtDestination] + " ORDER BY TransactionID" Si noti l'utilizzo del cast di tipo per modificare il valore Integer in un valore String di 12 caratteri al massimo. Si utilizza una lunghezza di 12 caratteri perché è sufficiente a contenere l'intervallo completo di valori SQL INT, inclusi i negativi se applicabili. Per BIGINT saranno necessari 22 caratteri. Assegnare alla variabile di tipo carattere la dimensione adeguata al tipo di dati recuperato. Dopo aver digitato l'espressione, fare clic sul pulsante Valuta espressione per assicurarsi che possa essere analizzata correttamente in SSIS. Si noterà che il valore iniziale di maxTransactionIDAtDestination è stato correttamente inserito nell'espressione valutata. Questo valore verrà impostato in modo appropriato in fase di esecuzione. Assicurarsi di includere la clausola ORDER BY nell'istruzione SQL, poiché solo con questa clausola si ottiene un ordine garantito da un database relazionale. Il metodo di riavvio creato dipenderà dall'ordine dei valori di chiave. d. Chiudere il Generatore di espressioni facendo clic sul pulsante OK. L'istruzione SQL costruita in modo dinamico è ora archiviata nella variabile SourceQuery. 11. Fare doppio clic sull'attività Flusso di dati Main data move per aprire l'area di progettazione del flusso di dati. 12. Trascinare un'origine OLE DB nell'area di progettazione del flusso di dati. Rinominarla in Retrieve from TransactionHistory. NOTA: poiché il nome di un componente del flusso di dati non può contenere punti, non è possibile utilizzare il nome completo Pull From Production.TransactionHistory. Se non si utilizzano già i caratteri di sottolineatura per i nomi di tabella, è possibile sostituire il punto con il carattere di sottolineatura nella convenzione di denominazione SSIS. 23 13. Fare doppio clic sull'origine Retrieve From TransactionHistory per aprire lo strumento Editor origine OLE DB. a. Per Gestione connessione OLE DB scegliere la gestione connessione Server di origine creata. b. Nell'elenco a discesa Modalità di accesso ai dati selezionare Comando SQL da variabile. c. Nell'elenco a discesa Nome variabile selezionare la variabile User::sourceQuery creata nel passaggio 10. d. Fare clic su Anteprima per verificare che la query possa essere eseguita sul server di origine. e. Nella pagina Colonne dell'editor verificare che tutte le colonne siano selezionate. f. Fare clic su OK per chiudere lo strumento Editor origine OLE DB. 14. Trascinare una destinazione OLE DB sull'area del flusso di controllo. Rinominarla in TransactionHistory Destination. Connettere l'origine Retrieve From TransactionHistory alla nuova destinazione. Aprire la destinazione facendo doppio clic e configurarla effettuando le operazioni seguenti. a. Selezionare la gestione connessione Server di destinazione nell'elenco a discesa Gestione connessione OLE DB. b. Per Modalità di accesso ai dati scegliere Tabella o vista - Caricamento rapido, se l'opzione non è già selezionata. c. In Nome tabella o vista selezionare un'opzione nell'elenco a discesa oppure digitare il nome del server di destinazione. In questo caso si tratta di Production.TransactionHistory. d. Se si utilizza la definizione di TransactionHistory fornita sopra nell'esempio, è possibile mantenere le impostazioni predefinite nella pagina Gestione connessione. Se si utilizza il database AdventureWorks, sarà necessario selezionare Mantieni valori Identity. e. Nella pagina Mapping dell'editor eseguire il mapping delle colonne. NOTA: in quasi tutti i casi è consigliabile inviare le righe di errore a un file di destinazione e reindirizzare l'output. Questa operazione non è necessaria per dimostrare il riavvio sulla pipeline. Per i passaggi sulla creazione di un flusso degli errori e sul reindirizzamento delle righe, vedere Configurazione di un output degli errori in un componente del flusso di dati (http://msdn.microsoft.com/it-it/library/ms140083.aspx). f. Fare clic su OK per chiudere lo strumento Editor destinazione OLE DB. 15. Testare questo approccio avviando un'importazione, arrestandola e avviandola nuovamente. Ogni volta il flusso di dati dovrebbe riprendere dalla riga successiva da spostare, ignorando quelle precedenti. 24 In questo modo è stato compilato un pacchetto semplice in grado di riavviare il flusso di dati dopo un errore. Il pacchetto verrà utilizzato come punto di partenza per l'esempio sulla progettazione di un pacchetto in grado di ripetere i tentativi. Si noti che non è opportuno salvare checkpoint in nessuna delle attività del flusso di controllo. Se il pacchetto viene interrotto e deve essere riavviato, è necessario eseguire i componenti Pull Min TransactionID From Source e Pull Max TransactionID From Destination per trovare il punto esatto di interruzione del flusso di lavoro nell'esecuzione precedente. La progettazione di un pacchetto in grado di individuare lo stato di avanzamento e riavviare il flusso in questo modo è una buona prassi in tutte le situazioni in cui le caratteristiche dei dati consentono di individuare il punto di interruzione del flusso dei dati. Questa prassi diventa particolarmente importante in un ambiente come il cloud, più esposto alle incertezze della rete. Esempio con più destinazioni Questo principio può essere esteso ai flussi di dati con più destinazioni. Uno scenario particolarmente adatto è quello dello spostamento dei dati in un modello di dati partizionati, tipico per il database SQL di Windows Azure. In questi casi viene utilizzata una suddivisione condizionale per inviare ogni riga alla destinazione corretta oppure, per i dati di riferimento, è possibile utilizzare un multicast per inviare tutti i dati a tutte le destinazioni. Di seguito sono riportati i principi fondamentali da ricordare per la progettazione del riavvio. Destinazioni diverse possono trovarsi a punti diversi di avanzamento al momento dell'errore. Per questo motivo, è necessario trovare il valore di chiave massimo inserito in ogni destinazione. Creare una variabile che contenga il valore massimo di ogni destinazione. Il punto iniziale nell'origine sarà il record successivo al valore di chiave minimo inserito correttamente nelle destinazioni. Se ad esempio i valori di chiave più alti inseriti in un set di partizioni sono quelli indicati di seguito, il flusso di dati nell'origine deve riprendere dal record successivo a 1000. o Shard00: valore di chiave 1000 o Shard01: valore di chiave 1100 o Shard02: valore di chiave 1050 Poiché in questo modo è possibile che alcuni dati vengano estratti più di una volta, è necessario applicare un filtro per ogni destinazione per impedire una violazione di chiave primaria. Utilizzare una trasformazione Suddivisione condizionale per filtrare i valori di chiave che sono già stati elaborati. Per l'esempio di partizionamento orizzontale precedente, è necessario creare variabili denominate maxTransactionIDAtShard00, maxTransactionIDAtShard01 e maxTransactionIDAtShard02. Nelle attività Esegui SQL trovare i valori da archiviare in ogni variabile. Nella trasformazione Suddivisione condizionale è possibile definire output denominati Shard00, Shard01 e Shard02. Le espressioni per gli output dovrebbero essere simili alle seguenti. ShardID == 0 && TransactionID > @[User::maxTransactionIDAtShard00] ShardID == 1 && TransactionID > @[User::maxTransactionIDAtShard01] ShardID == 2 && TransactionID > @[User::maxTransactionIDAtShard02] 25 Se nella pipeline vengono inserite righe con un valore minore del TransactionID di una specifica partizione, il record indirizzato a tale partizione non viene inviato e non si verifica alcuna violazione di chiave primaria. Configurare i record in modo che vengano indirizzati all'output predefinito o a un output non connesso per impedirne l'ulteriore elaborazione. Figura 2. Suddivisione condizionale configurata per 3 partizioni e per il riavvio senza violazioni di chiave primaria nella destinazione. All'inizio dell'esecuzione, il valore di chiave massimo in ogni destinazione viene archiviato nelle variabili maxTransactionIDAtShardXX. Le righe nella pipeline con un valore di chiave troppo basso per una specifica partizione non verranno inviate alla destinazione e non verranno rielaborate, ma passeranno invece all'output predefinito. Poiché l'output predefinito non è connesso, le righe non avanzeranno ulteriormente nella pipeline. 26 Altri suggerimenti per il riavvio Se la destinazione è un file, utilizzare una variabile per rappresentare il nome del file e rendere ogni nome significativo, ad esempio con un numero progressivo o un timestamp aggiunto alla fine. Elaborare blocchi di dati diversi in file diversi. Se l'elaborazione avviene nello stesso ordine e i blocchi vengono definiti in modo deterministico, è possibile verificare quali file sono già stati creati e individuare il punto iniziale di conseguenza. A seconda delle esigenze e della logica, potrebbe essere necessario spostare, rinominare o eliminare file già elaborati. Se l'origine è costituita da più file, elaborare separatamente ogni file e tenere traccia del file corrente. Al riavvio è possibile riprendere dal file successivo all'ultimo file elaborato correttamente. Utilizzare un criterio di ordinamento basato sui nomi di file o le date per assicurarsi che i file vengano elaborati ogni volta nello stesso ordine e poter quindi individuare facilmente l'ultimo file elaborato correttamente. Quando SQL Server è l'origine, è possibile utilizzare un tipo di dati String SSIS per eseguire una query e ottenere i valori Integer. Se è possibile eseguire il cast della stringa come Integer SQL, questo avverrà durante l'ottimizzazione. In base a questo principio, è possibile modificare nel tipo di dati String le variabili MaxTransactionIDAtDestination e MinTransactionIDAtSource nel pacchetto di esempio, modificare i tipi di parametri di input in Pull Max TransactionID From Destination e utilizzare questo pacchetto come modello, che funzionerà anche con chiavi primarie di tipo carattere. Non utilizzare un tipo di dati SQL_VARIANT con nessun altro tipo di dati in SQL, o verranno eseguite analisi complete nel corso del recupero dei valori di chiave massimi e minimi. Se l'origine è un file oppure un'origine in cui non è possibile eseguire query con WHERE o qualsiasi altro tipo di clausola filtro, nel flusso di dati effettuare le operazioni seguenti. 1. Inserire una trasformazione Suddivisione condizionale tra i componenti di origine e di destinazione. 2. Nella suddivisione condizionale configurare un output. Denominarlo Trash o utilizzare un altro nome che indichi che si tratta di righe indesiderate. 3. Per la condizione con la quale recuperare le righe inviate alla destinazione utilizzare un'espressione per filtrare le righe già presenti nella destinazione. Ad esempio, l'espressione per l'esempio precedente sarebbe la seguente. [TransactionID] <= @[User::maxTransactionIDAtDestination] 4. Non connettere l'output Trash ad alcun componente, a meno che non sia assolutamente necessario valutare tali righe. Il suo solo scopo è filtrare le righe già elaborate nell'ultima esecuzione. Questa procedura non impedisce la lettura delle righe già elaborate nel file di output, bensì che le righe vengano inviate di nuovo alla destinazione, risparmiando così larghezza di banda di rete. Poiché queste righe non vengono inviate alla destinazione, non è necessario eliminare dati dalla destinazione. 27 In presenza di chiavi composte, utilizzare sottoquery correlate per trovare l'esatto punto di interruzione. Assicurarsi di ordinare i dati in base alle stesse chiavi. Di seguito è riportato un esempio. SELECT MAX(EmployeeID) AS EmployeeID, (SELECT MAX(EffectiveDate) FROM HumanResources.EmployeeHistory i_forDate WHERE h.EmployeeID = i_forDate.EmployeeID) as EffectiveDate, (SELECT MAX(EffectiveSequence) from HumanResources.EmployeeHistory i_forSeq where h.EmployeeID = i_forSeq.EmployeeID and h.EffectiveDate = i.ForSeq.EffectiveDate) as EffectiveDate FROM HumanResources.EmployeeHistory h ORDER BY EmployeeID, EffectiveDate, EffectiveSequence Si noti l'importanza dell'ordine nell'esempio. Se si spostassero tutti i record di tutti i dipendenti e questo fosse l'ordine delle chiavi, il criterio di ordinamento sarebbe corretto. Tuttavia, se tutti o alcuni dipendenti fossero già presenti nella destinazione e si volessero importare solo le modifiche apportate dall'ultima importazione, l'ordinamento dovrebbe essere basato su EffectiveDate, EffectiveSequence ed EmployeeID per riprendere dall'ultima esecuzione. Analizzare gli elementi da importare per definire l'ordine che consente di individuare il punto da cui riprendere l'esecuzione. Progettazione della logica di ripetizione dei tentativi senza intervento manuale Nei componenti di origine e di destinazione SSIS la logica di ripetizione dei tentativi non è inclusa direttamente. Tuttavia, gli sviluppatori di pacchetti SSIS hanno a disposizione diversi metodi per gestire questo aspetto della progettazione. Quando si progettano i pacchetti SSIS in modo che possano essere riavviati senza perdita di avanzamento nel flusso di dati, è anche possibile configurare la ripetizione automatica dei tentativi dopo un errore, tenendo presenti alcune considerazioni aggiuntive. In casi quali lo spostamento dei dati da e verso database SQL di Windows Azure, la ripetizione automatica dei tentativi potrebbe essere necessaria per la gestione degli errori temporanei, come la limitazione di risorse o connessioni. In questa sezione vengono ampliati i concetti illustrati nella sezione precedente e viene descritto un esempio di pacchetto con una semplice logica di ripetizione dei tentativi. Viene poi illustrato l'utilizzo di un approccio a blocchi in cui la ripetizione dei tentativi viene configurata per ogni blocco in modo che il pacchetto risulti più affidabile e robusto nei momenti di maggiore probabilità degli errori temporanei. Per ulteriori informazioni sulla limitazione SQL, vedere la Guida all'ottimizzazione di elasticità e prestazioni del database SQL di Windows Azure (http://social.technet.microsoft.com/wiki/ contents/articles/3507.windows-azure-sql-database-performance-and-elasticity-guide.aspx). 28 Integrazione della ripetizione dei tentativi Nel caso di un singolo pacchetto, effettuare le operazioni seguenti per integrare la ripetizione dei tentativi. 1. Determinare il numero massimo di tentativi effettuati dal pacchetto prima dell'esito negativo. Per questo esempio viene stabilito che un componente potrà effettuare un massimo di 5 tentativi prima che il pacchetto restituisca un errore. Creare una variabile nel pacchetto denominata maxNumOfRetries. Assegnare alla variabile il tipo Int e il valore 5. Tali informazioni verranno utilizzate nelle espressioni del pacchetto. 2. Impostare una variabile per archiviare lo stato di esito positivo. Creare una nuova variabile nel pacchetto SSIS e denominarla attemptNumber. 3. Utilizzare un ciclo FOR per effettuare il numero massimo di tentativi se il flusso di dati non dà esito positivo. 29 4. Inserire l'attività Flusso di dati nel ciclo FOR. 5. Impostare la proprietà MaximumErrorCount del ciclo FOR sul numero massimo di tentativi da eseguire sul flusso di dati in modo che un esito positivo dopo un nuovo tentativo impedisca l'errore del pacchetto. A tale scopo, utilizzare un'espressione che includa la variabile maxNumOfRetries impostata nel passaggio 1. 6. Utilizzare le attività Esegui SQL come indicato nella sezione precedente per trovare i valori di chiave minimi nell'origine e quelli massimi nella destinazione. Per una ripetizione di tentativi semplice, questa operazione può essere effettuata all'interno del ciclo FOR. Per esempi più avanzati, questo passaggio può essere eseguito in un altro punto del flusso di controllo prima del ciclo FOR. 7. Inserire le attività Esegui SQL nel ciclo FOR. 8. Connettere il vincolo di esito positivo dall'attività Esegui SQL all'attività Flusso di dati. 9. Connettere il vincolo di precedenza di esito positivo dall'attività Flusso di dati a un'attività Script che imposti la variabile di stato con esito positivo su true per interrompere il ciclo FOR. Di seguito viene illustrato un esempio della configurazione dell'attività Script. 30 10. Connettere un vincolo di precedenza di errore dall'attività Flusso di dati a un'altra attività Script per un periodo prevedibilmente più lungo rispetto al problema più frequente o più critico stimato. In questo esempio verranno impostati 10 secondi per gestire l'eventualità della limitazione. Impostare la variabile di esito positivo su false. 31 11. Per ogni attività nel ciclo FOR, impostare la proprietà FailPackageOnFailure su false. Con questa configurazione, verrà segnalato un errore e il pacchetto verrà interrotto con esito negativo solo nel caso di mancata riuscita del ciclo FOR una volta utilizzati tutti i tentativi configurati. 12. Configurare le attività Esegui SQL dopo l'errore per controllare nuovamente i valori di chiave minimi nell'origine e quelli massimi nella destinazione e poter riprendere dall'avanzamento senza ripetere le operazioni. Impostare le attività come descritto nella sottosezione Progettazione del riavvio della precedente sezione Progettazione del riavvio senza perdita dell'avanzamento nella pipeline di questo documento. 32 Se ogni volta che si verifica un errore nel flusso di dati non viene raggiunto il numero massimo di tentativi, il processo torna al punto corrispondente alla ricerca del valore di chiave massimo nella destinazione. L'elaborazione continua dal punto di cui viene attualmente eseguito il commit nella destinazione. Se il flusso di dati include più destinazioni, iniziare dopo che il valore di chiave minimo è arrivato a destinazione e utilizzare una suddivisione condizionale o un flusso di errori per gestire le righe che causerebbero una violazione di chiave primaria. Opzioni di ottimizzazione delle prestazioni di SSIS Prima di considerare i suggerimenti per l'ottimizzazione delle prestazioni ETL, è opportuno esaminare nell'insieme i componenti e le parti mobili inclusi nel processo. In genere il processo ETL è costituito da uno o più dei componenti indicati di seguito: Origine dati: fornisce i dati. Pacchetto in esecuzione sul server SSIS: esegue l'estrazione dei dati dall'origine dati, l'elaborazione delle trasformazioni se necessario e il caricamento dei dati nella destinazione. Destinazione: riceve i dati. La destinazione è in genere un database con una o più tabelle che ricevono i dati. Tutte queste parti principali interagiscono sull'interfaccia di rete e si passano i dati. Uno dei primi passaggi dell'ottimizzazione delle prestazioni ETL consiste nel verificare che la rete funzioni nel miglior modo possibile. Per ulteriori informazioni sul server SSIS, vedere Server Integration Services (SSIS) (http://msdn.microsoft.com/it-it/library/gg471508.aspx). Ottimizzazione delle impostazioni di rete Due sono i livelli che possono determinare il modo in cui i dati vengono trasmessi tra le parti definite sopra: la configurazione della rete fisica e le impostazioni di connessione. 33 Impostazioni di rete La quantità di dati che possono essere trasmessi in rete contemporaneamente è definita dal frame Ethernet. Ogni frame deve essere elaborato, il che comporta un certo utilizzo di risorse hardware e software. Aumentando le dimensioni dei frame ove la scheda di rete lo consenta, è possibile inviare più byte con un minore overhead sulla CPU e aumentare la velocità effettiva riducendo il numero di frame da elaborare. Un frame Ethernet può trasportare fino a 9000 byte. In questo caso viene chiamato frame jumbo. Per poter utilizzare i frame jumbo, è necessario modificare le impostazioni delle schede di interfaccia di rete. Come nell'esempio seguente, la proprietà MaxJumboBuffers deve essere impostata su 8192 per consentire l'utilizzo dei frame jumbo. Nota: quando si modificano le impostazioni della scheda di interfaccia di rete per utilizzare i frame jumbo, verificare che l'infrastruttura di rete supporti questo tipo di frame. Dimensioni di pacchetto SQL Server supporta fino a 32676 byte in un unico pacchetto di rete SSIS. In genere se un'applicazione prevede dimensioni di pacchetto predefinite diverse, il valore predefinito sostituisce l'impostazione di SQL Server. Si consiglia pertanto di impostare la proprietà Packet Size della gestione connessione di destinazione nel pacchetto SSIS sulle dimensioni di pacchetto predefinite dell'applicazione. Per modificare questa proprietà, fare clic con il pulsante destro del mouse sulla gestione connessione in Progettazione SSIS e scegliere Modifica. Nella finestra di dialogo Gestione connessione fare clic su Tutto. 34 Impostazioni del pacchetto SSIS Oltre alle impostazioni della stringa di connessione, è possibile modificarne anche altre per migliorare le funzionalità di elaborazione di SQL Server. Per il flusso di dati SSIS vengono riservati alcuni buffer di memoria per l'elaborazione dei dati. Se si dispone di server dedicati con più core e maggiore memoria, è spesso possibile modificare le impostazioni di memoria predefinite per SSIS in modo da sfruttare meglio le capacità del server SSIS. Di seguito sono riportate le impostazioni di memoria SSIS che è consigliabile modificare. 35 DefaultBufferSize DefaultBufferMaxRows EngineThreads DefaultBufferSize e DefaultBufferMaxRows sono correlate. Il motore flusso di dati tenta di stimare le dimensioni di una singola riga di dati. Queste dimensioni vengono moltiplicate per il valore archiviato in DefaultBufferMaxRows, quindi il motore flusso dati tenta di riservare il blocco appropriato di memoria per il buffer. [Valore delle dimensioni del buffer] = [Dimensioni di una singola riga di dati] x [DefaultBufferMaxRows] Se il valore delle dimensioni del buffer è maggiore dell'impostazione DefaultBufferSize, viene diminuito il numero di righe di dati. Se il valore delle dimensioni minime del buffer calcolate internamente è maggiore del valore delle dimensioni del buffer, il numero di righe di dati viene aumentato. Tuttavia, il valore di DefaultBufferMaxRows non viene superato. Quando si modificano le impostazioni DefaultBufferSize e DefaultBufferMaxRows, è bene prestare attenzione ai valori che provocheranno la scrittura dei dati sui dischi da parte del motore flusso di dati. Il page out della memoria sul disco del server SSIS influisce negativamente sulle prestazioni di esecuzione del pacchetto SSIS. Controllando il contatore dei buffer con spooling è possibile stabilire se i buffer dei dati vengono scritti temporaneamente sul disco quando un pacchetto è in esecuzione. Per ulteriori informazioni sui contatori delle prestazioni dei pacchetti SSIS e su come ottenere le statistiche dei contatori, vedere Contatori delle prestazioni (http://msdn.microsoft.com/itit/library/ms137622.aspx). 36 L'impostazione EngineThreads indica quanti thread possono essere utilizzati per l'esecuzione di un'attività. Quando si utilizza il server multicore, è consigliabile aumentare il valore predefinito 10. Indipendentemente dal valore di questa proprietà, non verranno comunque utilizzati più thread del necessario. Il motore può inoltre utilizzare un numero di thread maggiore di quello specificato da questa proprietà, se necessario per evitare problemi di concorrenza. Per i pacchetti complessi è consigliabile iniziare con un minimo di 1 thread del motore per ogni albero di esecuzione, senza però scendere sotto il valore predefinito 10. Per ulteriori informazioni sulle impostazioni, vedere Funzionalità delle prestazioni del flusso di dati (http://msdn.microsoft.com/it-it/library/ms141031.aspx). Considerazioni speciali per i dati BLOB Quando in una pipeline SSIS è presente una quantità di dati maggiore rispetto alle dimensioni preimpostate del buffer della pipeline, viene eseguito lo spooling dei dati. Questo influisce negativamente sulle prestazioni, in particolare quando si gestiscono dati BLOB, ad esempio XML, di tipo testo o immagine. Quando i dati BLOB sono nella pipeline, SSIS riserva una metà di un buffer ai dati all'interno di righe e un'altra metà ai dati BLOB. I dati BLOB che restano esclusi dalla metà del buffer vengono sottoposti a spooling. È quindi opportuno intraprendere le azioni seguenti per ottimizzare i pacchetti SSIS in previsione dell'inserimento di dati BLOB nella pipeline: 1. Modificare il valore di BLOBTempStoragePath e BufferTempStoragePath in modo che puntino a un'unità a prestazioni elevate. Per impostazione predefinita, gli oggetti sottoposti a spooling vengono scritti in file temporanei nella directory definita dalle variabili di ambiente TEMP o TMP, che per impostazione predefinita si trova sull'unità del sistema operativo. In genere l'unità del sistema operativo non è un'unità a prestazioni elevate. Per assicurarsi che i file di spooling dei dati temporanei vengano scritti su un'unità a prestazioni elevate, impostare il valore di BLOBTempStoragePath nelle proprietà dell'attività Flusso di dati SSIS su una directory di una risorsa di archiviazione di tipo adeguato. Come per tutte le proprietà di SSIS, è possibile impostare questo valore utilizzando un'espressione. 2. Impostare DefaultBufferSize e DefaultBufferMaxRows in modo da ridurre al minimo la necessità di spooling. Poiché i dischi sono in genere il componente più lento sul server e hanno normalmente una velocità molto più bassa del processore o della memoria, è possibile che un uso poco efficiente dello spazio del buffer si riveli in realtà più efficiente di una configurazione che consente lo spooling. Per ridurre lo spooling dovuto ai dati BLOB, utilizzare un metodo come quello indicato di seguito per determinare i valori di DefaultBufferSize e DefaultBufferMaxRows quando il flusso di dati contiene dati BLOB. a. Determinare il valore di MaxBufferSize. Poiché il flusso di dati conterrà dati BLOB, è consigliabile iniziare con il valore massimo consentito di 100 MB o 104.857.600 byte. b. Dividere questo numero per 2. Nell'esempio il risultato è 52.428.800 byte, che equivale alla metà del buffer che può contenere dati BLOB. 37 c. Selezionare una dimensione da utilizzare come dimensione stimata dei dati BLOB da elaborare nel flusso di dati. Un buon punto di partenza per determinare questa dimensione consiste nel calcolare la lunghezza media + 2 deviazioni standard sulla lunghezza media di tutti i dati BLOB che saranno presenti in un buffer. Questo valore conterrà approssimativamente il 98% di tutti i dati BLOB. Poiché è probabile che un singolo buffer SSIS contenga più righe, questo metodo impedisce quasi del tutto il verificarsi di operazioni di spooling. Se l'origine è SQL Server, è possibile utilizzare una query analoga alla seguente per acquisire la lunghezza. SELECT CAST ( AVG(DATALENGTH(ColName)) + (2 * STDEV(DATALENGTH(Demographics))) AS INT ) AS Length FROM SchemaName.TableName Se la tabella è troppo grande per consentire l'esecuzione di query sul set di dati completo per ottenere i valori di media e deviazione standard, utilizzare un metodo simile a quello descritto nella pagina relativa al campionamento casuale in T-SQL (http://msdn.microsoft.com/it-it/library/aa175776(v=SQL.80).aspx) per individuare un esempio in cui trovare la lunghezza da utilizzare. d. Dividere il numero ottenuto nel passaggio b per il numero ottenuto nel passaggio c. Utilizzare il risultato o un numero leggermente minore come valore di DefaultBufferMaxRows per l'attività Flusso di dati. SUGGERIMENTO: DefaultBufferMaxRows e MaxBufferSize sono entrambe configurabili tramite espressioni. È possibile avvalersi di questa possibilità per i set di dati in cui la natura statistica della lunghezza dei dati BLOB può cambiare spesso o per la creazione di pacchetti modello per impostare questi valori in fase di esecuzione. Per impostare questi valori come dinamici, effettuare le operazioni seguenti. 1. Creare una nuova variabile a livello di pacchetto. Denominarla DefaultMaxRowsInBuffer. Mantenere il tipo di dati Int32. Creare una variabile simile se si desidera impostare dinamicamente la proprietà MaxBufferSize. 2. Utilizzare un'attività Esegui SQL o un'attività Script per trovare il valore da utilizzare per DefaultBufferMaxRows. Archiviare il valore calcolato nella variabile DefaultMaxRowsInBuffer creata nel passaggio 1. NOTA: per ulteriori informazioni su come utilizzare un'attività Esegui SQL per recuperare un singolo valore in una variabile SSIS, vedere Set di risultati nell'attività Esegui SQL (http://technet.microsoft.com/it-it/library/cc280492.aspx). 3. Nella casella delle proprietà dell'attività Flusso di dati in cui si desidera impostare DefaultBufferMaxRows selezionare Espressioni per visualizzare la finestra di dialogo Editor espressioni di proprietà. 38 4. In Editor espressioni di proprietà scegliere DefaultBufferMaxRows dal menu a discesa Proprietà e fare clic sul pulsante con i puntini di sospensione per aprire il Generatore di espressioni. 5. Trascinare la variabile creata nel passaggio 1 dall'elenco Variabili e parametri nell'angolo in alto a sinistra alla casella Espressione e fare clic su Valuta espressione per visualizzare il valore predefinito della variabile nella casella Valore valutato. 6. Fare clic su OK nelle finestre di dialogo Generatore di espressioni ed Editor espressioni di proprietà per salvare la configurazione. In questa configurazione il valore delle proprietà verrà impostato in fase di esecuzione per ridurre le probabilità di spooling dei dati BLOB sui dischi. Utilizzo delle nuove funzionalità di SSIS 2012 per monitorare le prestazioni in un sistema distribuito In SQL Server 2012 sono disponibili nuove funzionalità per monitorare le prestazioni dei progetti di Integration Services (SSIS) distribuiti sul server SSIS. È possibile registrare le informazioni sulle prestazioni di runtime per l'esecuzione di un pacchetto, visualizzare le statistiche di esecuzione e monitorare il flusso di dati del pacchetto. 39 Registrare le statistiche sulle prestazioni Specificare l'ambito delle informazioni registrate durante l'esecuzione di un pacchetto selezionando uno dei livelli di registrazione seguenti. Per registrare le statistiche sulle prestazioni, selezionare il livello Prestazioni o Dettagliato. Livello di registrazione Nessuno Valore Descrizione 0 Standard 1 La registrazione è disabilitata. Viene registrato solo lo stato dell'esecuzione del pacchetto. Vengono registrati tutti gli eventi tranne gli eventi personalizzati e di diagnostica. È il valore predefinito. Prestazioni 2 Vengono registrate solo le statistiche sulle prestazioni e gli eventi OnError e OnWarning. Dettagliato 3 Vengono registrati tutti gli eventi, inclusi gli eventi personalizzati e di diagnostica. In Integration Services sono disponibili numerosi eventi personalizzati per la scrittura di voci di log per i pacchetti e per molte attività. È possibile utilizzare tali voci per salvare informazioni dettagliate su stato di esecuzione, risultati e problemi, registrando eventi predefiniti o messaggi definiti dall'utente da analizzare in un secondo momento. Per ulteriori informazioni, vedere Messaggi personalizzati per la registrazione (http://msdn.microsoft.com/it-it/library/ms345174.aspx) È possibile specificare il livello di registrazione eseguendo una o più delle operazioni seguenti per un'istanza di esecuzione di un pacchetto. Impostare i parametri per un'istanza di esecuzione di un pacchetto tramite la stored procedure catalog.set_execution_parameter_value (http://msdn.microsoft.com/it-it/library/ff877990.aspx). Configurare un'istanza di esecuzione di un pacchetto nella finestra di dialogo Esegui pacchetto. Configurare un processo di SQL Server Agent per l'esecuzione di un pacchetto nella finestra di dialogo Nuovo passaggio di processo. Per impostare il livello di registrazione nella finestra di dialogo Esegui pacchetto 1. 2. 3. 4. 40 In SQL Server Management Studio passare al pacchetto in Esplora oggetti. Fare clic con il pulsante destro del mouse sul pacchetto e selezionare Esegui. Selezionare la scheda Avanzate. In Livello di registrazione selezionare il livello di registrazione. Per impostare il livello di registrazione nella finestra di dialogo Nuovo passaggio di processo 1. Creare un nuovo processo espandendo il nodo SQL Server Agent in Esplora oggetti, facendo clic con il pulsante destro del mouse su Processi, quindi scegliendo Nuovo processo. Oppure Modificare un processo esistente espandendo il nodo SQL Server Agent, facendo clic con il pulsante destro del mouse su un processo esistente e quindi scegliendo Proprietà. 2. Fare clic su Passaggi nel riquadro sinistro, quindi scegliere Nuovo per aprire la finestra di dialogo Nuovo passaggio di processo. 3. Selezionare Pacchetto di SQL Server Integration Services nella casella di riepilogo Tipo. 4. Nella scheda Pacchetto selezionare Catalogo SSIS nella casella di riepilogo Origine pacchetto, specificare il server, quindi immettere il percorso del pacchetto nella casella Pacchetto. 5. Nella scheda Configurazione fare clic su Avanzate, quindi selezionare un livello di registrazione nella casella di riepilogo Livello di registrazione. 6. Completare la configurazione del passaggio di processo e salvare le modifiche. Per impostare il livello di registrazione utilizzando la stored procedure catalog.set_execution_parameter_value, impostare parameter_name su LOGGING_LEVEL e parameter_value sul valore corrispondente a Prestazioni o Dettagliato. Nell'esempio seguente viene creata un'istanza di esecuzione del pacchetto Package.dtsx e viene impostato il livello di registrazione su 2. Il pacchetto è contenuto nel progetto SSISPackages, che si trova nella cartella Packages. Declare @execution_id bigint exec catalog.create_execution 'Packages', 'SSISPackages', 'Package.dtsx', NULL, 1, @execution_id output exec catalog.set_execution_parameter_value @execution_id, 50, 'LOGGING_LEVEL', 2 Visualizzare le statistiche di esecuzione Le viste e le stored procedure del database SSISDB e i report standard disponibili in SQL Server Management Studio forniscono numerose informazioni sulle esecuzioni dei pacchetti e altre informazioni pertinenti. Un'esecuzione è un'istanza di esecuzione di un pacchetto. Tra i report standard, Dashboard Integration Services, Tutte le esecuzioni e Tutte le connessioni sono particolarmente utili per visualizzare le informazioni di esecuzione dei pacchetti. Il report Dashboard Integration Services fornisce le informazioni seguenti per i pacchetti in esecuzione o eseguiti nelle ultime 24 ore. 41 Report Dashboard Integration Services Sezione del report Informazioni sulle esecuzioni Informazioni sui pacchetti Informazioni sulle connessioni Informazioni dettagliate sui pacchetti Descrizione Indica il numero di esecuzioni che si trovano in stati diversi (operazione non riuscita, in esecuzione, operazione riuscita e altri). Indica il numero totale di pacchetti eseguiti. Indica le connessioni utilizzate nelle esecuzioni che hanno restituito un errore. Indica per ogni pacchetto i dettagli relativi alle esecuzioni completate. Vengono ad esempio riportati il numero di esecuzioni non riuscite rispetto al totale, la durata di un'esecuzione (in secondi) e la durata media delle esecuzioni negli ultimi tre mesi. È possibile visualizzare ulteriori informazioni sull'esecuzione di un pacchetto facendo clic su Prestazioni di esecuzione, Panoramica e Tutti i messaggi. Il report Prestazioni di esecuzione contiene grafici della durata delle ultime 10 esecuzioni riuscite e dei valori di Tempo di attività e Tempo totale per i componenti del flusso di dati del pacchetto. Il tempo di attività si riferisce alla quantità totale di tempo di esecuzione del componente in tutte le fasi, mentre il tempo totale è quello trascorso per un componente. Il report contiene queste informazioni per i componenti del flusso di dati solo se il livello di registrazione dell'ultima esecuzione del pacchetto è stato impostato su Prestazioni o Dettagliato. Il report Panoramica indica lo stato delle attività del pacchetto. Il report Messaggi contiene i messaggi di evento e di errore per il pacchetto e le attività, ad esempio la data e l'ora di inizio e di fine e il numero di righe scritte. 42 Il report Tutte le esecuzioni fornisce le informazioni indicate di seguito, relative alle esecuzioni completate nell'istanza di SQL Server connessa. Possono essere presenti più esecuzioni dello stesso pacchetto. A differenza del report Dashboard Integration Services, è possibile configurare il report Tutte le esecuzioni per visualizzare le esecuzioni avviate durante un intervallo di date. Gli intervalli di date possono coprire più giorni, mesi o anni. Report Tutte le esecuzioni Sezione del report Filtro Informazioni sulle esecuzioni Descrizione Indica il filtro attualmente applicato al report, ad esempio Intervallo ora di inizio. Indica le date e le ore di inizio e di fine e la durata dell'esecuzione di ogni pacchetto. È possibile visualizzare un elenco di valori dei parametri utilizzati con l'esecuzione di un pacchetto, ad esempio i valori passati a un pacchetto figlio utilizzando l'attività Esegui pacchetto. Per visualizzare l'elenco dei parametri, fare clic su Panoramica. 43 Il report Tutte le connessioni fornisce le informazioni indicate di seguito, relative alle connessioni non riuscite per le esecuzioni completate nell'istanza di SQL Server. Sezione del report Filtro Dettagli 44 Descrizione Indica il filtro attualmente applicato al report, ad esempio le connessioni con una stringa specificata e il valore di Intervallo di ore ultimo errore. Impostare un valore per Intervallo di ore ultimo errore per visualizzare solo gli errori di connessione restituiti durante un intervallo di date. L'intervallo può coprire più giorni, mesi o anni. Indica la stringa di connessione, il numero di esecuzioni durante le quali si è verificato un errore di connessione e la data e l'ora dell'ultima connessione non riuscita. Oltre a visualizzare i report standard disponibili in SQL Server Management Studio, è anche possibile eseguire una query sulle viste del database SSISDB per ottenere informazioni analoghe sulle esecuzioni dei pacchetti. Nella tabella seguente vengono descritte le viste principali. Vista del database SSISDB catalog.executable_statistics (http://msdn.microsoft.com/ it-it/library/hh479592.aspx) Descrizione Consente di visualizzare una riga per ogni file eseguibile in esecuzione, inclusa ogni iterazione di un file eseguibile. Un eseguibile è un'attività o un contenitore aggiunto al flusso di controllo di un pacchetto. Ad esempio, la vista indica la durata dell'esecuzione dell'eseguibile, la data e l'ora in cui il file eseguibile passa alle fasi di pre-esecuzione e post-esecuzione e il risultato dell'esecuzione del file eseguibile, ad esempio l'esito positivo o negativo. catalog.executions (http://msdn.microsoft.com/ it-it/library/ff878089.aspx) Un esempio di risultato di esecuzione è il codice restituito dalla stored procedure eseguita da un'attività Esegui SQL. Per ulteriori informazioni, vedere Parametri e codici restituiti nell'attività Esegui SQL. Consente di visualizzare informazioni sulle esecuzioni dei pacchetti. I pacchetti eseguiti con l'attività Esegui pacchetto sono inclusi nella stessa esecuzione del pacchetto padre. Ad esempio, la vista indica lo stato di un'esecuzione (in corso, operazione non riuscita, operazione riuscita e altri), la memoria fisica totale e quella disponibile sul server all'avvio dell'esecuzione e la memoria di paging totale e quella disponibile all'avvio dell'esecuzione. catalog.execution_component_phases Consente di visualizzare le date e le ore di inizio e di fine per (http://msdn.microsoft.com/ i componenti del flusso di dati per ogni fase di un'esecuzione. it-it/library/hh230981.aspx) Tali informazioni vengono visualizzate per le esecuzioni di più pacchetti. catalog.event_messages (http://msdn.microsoft.com/ it-it/library/hh479594.aspx) La vista contiene queste informazioni per i componenti del flusso di dati solo quando il livello di registrazione dell'esecuzione è impostato su Prestazioni o Dettagliato. Consente di visualizzare informazioni sui messaggi registrati durante operazioni come la creazione e l'avvio dell'esecuzione di un pacchetto. Il valore per questo tipo di operazione è 200. Ad esempio, la vista indica il testo del messaggio, il componente del pacchetto e il componente del flusso di dati che rappresentano l'origine del messaggio e l'evento associato al messaggio. I messaggi visualizzati per l'esecuzione di un pacchetto dipendono dal livello di registrazione impostato per l'esecuzione. 45 Vista del database SSISDB catalog.event_message_context (http://msdn.microsoft.com/ it-it/library/hh479590.aspx) Descrizione Consente di visualizzare le informazioni sulle condizioni associate ai messaggi di evento delle esecuzioni. Ad esempio, la vista indica l'oggetto associato al messaggio di evento, ad esempio un valore di variabile o un'attività, e il nome e il valore della proprietà associati al messaggio di evento. Viene inoltre visualizzato l'ID di ogni messaggio di evento. È possibile ottenere ulteriori informazioni su un messaggio di evento specifico eseguendo una query sulla vista catalog.event_messages. È possibile utilizzare la vista catalog.execution_component_phases per calcolare il tempo di esecuzione in tutte le fasi (tempo di attività) e il tempo totale trascorso (tempo totale) per i componenti di un pacchetto. In questo modo è possibile determinare più facilmente i componenti la cui esecuzione è più lenta del previsto. Questa vista viene popolata quando il livello di registrazione dell'esecuzione del pacchetto è impostato su Prestazioni o Dettagliato. Per ulteriori informazioni, vedere Registrare le statistiche sulle prestazioni in questo articolo. Nell'esempio seguente vengono calcolati il tempo di attività e il tempo totale per i componenti in esecuzione con ID 33. Nel calcolo vengono utilizzate le funzioni sum e DATEDIFF. Declare @execution_id bigint Set @execution_id = 33 select package_name, task_name, subcomponent_name, execution_path, sum (DATEDIFF(ms, start_time, end_time)) as active_time, DATEDIFF(ms,min(start_time), max(end_time)) as total_time from catalog.execution_component_phases where execution_id = @execution_id group by package_name, task_name, subcomponent_name, execution_path order by active_time desc 46 Infine, è possibile utilizzare la funzione dm_execution_performance_counters per ottenere le statistiche dei contatori delle prestazioni, ad esempio il numero di buffer utilizzati e il numero di righe lette e scritte per l'esecuzione in corso. Nell'esempio seguente la funzione restituisce le statistiche di un'esecuzione in corso con ID 34. select * from [catalog].[dm_execution_performance_counters] (34) Nell'esempio seguente la funzione restituisce le statistiche di tutte le esecuzioni in corso. select * from [catalog].[dm_execution_performance_counters] (NULL) Monitorare il flusso di dati In Integration Services sono disponibili funzionalità e strumenti utili per la risoluzione dei problemi del flusso di dati in un pacchetto nel corso dell'esecuzione. Aggiunta di una scelta dei dati al flusso di dati durante l'esecuzione SQL Server Integration Services (SSIS) in SQL Server 2012 offre una nuova funzionalità che consente di aggiungere una scelta dei dati in un percorso del flusso di dati di un pacchetto in fase di esecuzione e inviare l'output dalla scelta dei dati a un file esterno. Per utilizzare questa funzionalità è necessario distribuire il progetto SSIS utilizzando il modello di distribuzione del progetto in un server SSIS. Dopo avere distribuito il pacchetto nel server, è necessario eseguire script T-SQL sul database SSISDB per aggiungere le scelte dei dati prima dell'esecuzione del pacchetto. Di seguito viene fornito uno scenario di esempio: 1. Creare un'istanza di esecuzione di un pacchetto tramite la stored procedure catalog.create_execution (http://msdn.microsoft.com/it-it/library/ff878034). 47 2. Aggiungere una scelta dei dati tramite la stored procedure catalog.add_data_tap (http://msdn.microsoft.com/it-it/library/hh230989) o catalog.add_data_tap_by_guid (http://msdn.microsoft.com/it-it/library/hh230991). 3. Avviare l'istanza di esecuzione del pacchetto tramite la stored procedure catalog.start_execution (http://msdn.microsoft.com/it-it/library/ff878160). Di seguito è riportato uno script SQL di esempio che esegue i passaggi descritti nello scenario precedente: Declare @execid bigint EXEC [SSISDB].[catalog].[create_execution] @folder_name=N'ETL Folder', @project_name=N'ETL Project', @package_name=N'Package.dtsx', @execution_id=@execid OUTPUT EXEC [SSISDB].[catalog].add_data_tap @execution_id = @execid, @task_package_path = '\Package\Data Flow Task', @dataflow_path_id_string = 'Paths[Flat File Source.Flat File Source Output]', @data_filename = 'output.txt' EXEC [SSISDB].[catalog].[start_execution] @execid I parametri per i nomi di cartella, di progetto e di pacchetto della stored procedure create_execution corrispondono ai nomi della cartella, del progetto e del pacchetto nel catalogo di Integration Services. È possibile ottenere tali nomi per utilizzarli nella chiamata a create_execution da SQL Server Management Studio, come illustrato nella figura seguente. Se il progetto SSIS non viene visualizzato, è possibile che non sia stato ancora distribuito sul server SSIS. Fare clic con il pulsante destro del mouse sul progetto SSIS in Visual Studio e scegliere Distribuisci per distribuire il progetto nel server SSIS previsto. 48 Anziché digitare le istruzioni SQL, è possibile generare lo script di esecuzione del pacchetto con la procedura seguente: 1. Fare clic con il pulsante destro del mouse su Package.dtsx e scegliere Esegui. 2. Fare clic sul pulsante della barra degli strumenti Script per generare lo script. 3. Aggiungere l'istruzione add_data_tap prima della chiamata a start_execution. Il parametro task_package_path della stored procedure add_data_tap corrisponde alla proprietà PackagePath dell'attività Flusso di dati in Visual Studio. In Visual Studio fare clic con il pulsante destro del mouse sull'attività Flusso di dati e scegliere Proprietà per aprire la finestra Proprietà. Annotare il valore della proprietà PackagePath per utilizzarlo come valore per il parametro task_package_path per la chiamata alla stored procedure add_data_tap. Il parametro dataflow_path_id_string della stored procedure add_data_tap corrisponde alla proprietà IdentificationString del percorso del flusso di dati a cui si desidera aggiungere una scelta dei dati. Per ottenere dataflow_path_id_string, fare clic sul percorso del flusso di dati e annotare il valore della proprietà IdentificationString indicato nella finestra Proprietà. 49 Quando si esegue lo script, l'output viene archiviato in <Programmi>\Microsoft SQL Server\110\DTS\DataDumps. Se esiste già un file con lo stesso nome, viene creato un nuovo file con un suffisso (ad esempio output[1].txt). Come accennato in precedenza, è possibile anche utilizzare la stored procedure catalog.add_data_tap_by_guid (http://msdn.microsoft.com/it-it/library/hh230991) invece di add_data_tap. Questa stored procedure accetta l'ID dell'attività Flusso di dati come parametro anziché task_package_path. È possibile ottenere l'ID dell'attività Flusso di dati nella finestra delle proprietà di Visual Studio. Rimozione di una scelta dei dati È possibile rimuovere una scelta dei dati prima di avviare l'esecuzione utilizzando la stored procedure catalog.remove_add_data_tap. Questa stored procedure accetta come parametro l'ID della scelta dei dati, che è possibile ottenere come output della stored procedure add_data_tap. DECLARE @tap_id bigint EXEC [SSISDB].[catalog].add_data_tap @execution_id = @execid, @task_package_path = '\Package\Data Flow Task', @dataflow_path_id_string = 'Paths[Flat File Source.Flat File Source Output]', @data_filename = 'output.txt' @data_tap_id=@tap_id OUTPUT EXEC [SSISDB].[catalog].remove_data_tap @tap_id 50 Visualizzazione di un elenco di tutte le scelte dei dati È anche possibile elencare tutte le scelte dei dati utilizzando la vista catalog.execution_data_taps. Nell'esempio seguente vengono estratte le scelte dei dati per una specifica istanza di esecuzione (ID: 54). select * from [SSISDB].[catalog].execution_data_taps where execution_id=@execid Considerazione sulle prestazioni L'abilitazione del livello di registrazione Dettagliato e l'aggiunta di scelte dei dati aumentano le operazioni di I/O eseguite dalla soluzione di integrazione dei dati in uso. Per questo motivo, è consigliabile aggiungere scelte dei dati solo ai fini della risoluzione dei problemi. Monitoraggio del flusso di dati durante l'esecuzione È possibile utilizzare la vista del database SSISDB catalog.execution_data_statistics (http://msdn.microsoft.com/it-it/library/hh230986.aspx) per analizzare il flusso di dati dei pacchetti. Viene visualizzata una riga ogni volta che un componente del flusso di dati invia dati a un componente a valle. Grazie a queste informazioni è possibile determinare con maggiore precisione le righe inviate a ciascun componente. Nota: per acquisire informazioni con la vista catalog.execution_data_statistics, è necessario che il livello di registrazione sia impostato su Dettagliato. Nell'esempio seguente viene visualizzato il numero di righe inviate tra i componenti di un pacchetto. execution_id è l'ID di un'istanza di esecuzione che è possibile ottenere come valore restituito dalla stored procedure create_execution o nella vista catalog.executions. use SSISDB select package_name, task_name, source_component_name, destination_component_name, rows_sent from catalog.execution_data_statistics where execution_id = 132 order by source_component_name, destination_component_name 51 Nell'esempio seguente viene calcolato il numero di righe al millisecondo inviate da ogni componente per un'esecuzione specifica. I valori calcolati sono: total_rows: somma di tutte le righe inviate dal componente wall_clock_time_ms: tempo totale di esecuzione trascorso, in millisecondi, per ogni componente num_rows_per_millisecond: numero di righe al millisecondo inviate da ogni componente La clausola HAVING viene utilizzata per impedire un errore di divisione per zero nei calcoli. use SSISDB select source_component_name, destination_component_name, sum(rows_sent) as total_rows, DATEDIFF(ms,min(created_time),max(created_time)) as wall_clock_time_ms, ((0.0+sum(rows_sent)) / (datediff(ms,min(created_time),max(created_time)))) as [num_rows_per_millisecond] from [catalog].[execution_data_statistics] where execution_id = 132 group by source_component_name, destination_component_name having (datediff(ms,min(created_time),max(created_time))) > 0 order by source_component_name desc Conclusione SQL Server Integration Services (SSIS) può essere utilizzato come efficace strumento per spostare i dati da e verso il database SQL di Windows Azure, come parte della soluzione globale di estrazione, trasformazione e caricamento (ETL) e della soluzione di spostamento di dati, ed è ideale per spostare dati tra origini e destinazioni nel cloud e, in scenari ibridi, tra ambienti cloud e locali. In questo white paper sono state descritte le procedure consigliate SSIS per le origini e le destinazioni cloud, è stata illustrata la pianificazione di progetti SSIS sia circoscritti al cloud che riguardanti ambienti ibridi ed è stato descritto in modo dettagliato un esempio di ottimizzazione delle prestazioni in uno spostamento ibrido tramite la scalabilità orizzontale dello spostamento dei dati. 52 Per ulteriori informazioni http://www.microsoft.com/italy/server/sql: sito Web SQL Server http://technet.microsoft.com/it-it/sqlserver/: TechCenter di SQL Server http://msdn.microsoft.com/it-it/sqlserver/: risorse online per gli sviluppatori di SQL Server Il documento è risultato utile? Esprimere una valutazione utilizzando una scala compresa tra 1 (scarso) e 5 (eccellente), indicandone i motivi. Ad esempio: La valutazione è alta perché il documento contiene esempi validi, catture di schermate nitide, spiegazioni chiare o altri motivi? La valutazione è bassa perché il documento contiene esempi confusi, catture di schermate sfocate, spiegazioni poco chiare? I commenti aiuteranno Microsoft a migliorare la qualità dei white paper pubblicati. Commenti e suggerimenti. 53