Praktischer Leitfaden und Optimierungshandbuch zu SSIS

Werbung
Praktischer Leitfaden und
Optimierungshandbuch zu SSIS
Technischer Artikel zu SQL Server
Autoren: Alexei Khalyako, Carla Sabotta, Silvano Coriani, Sreedhar Pelluru, Steve Howard
Technische Bearbeiter: Cindy Gross, David Pless, Mark Simms, Daniel Sol
Veröffentlicht: Dezember 2012
Betrifft: SQL Server 2012, Windows Azure SQL-Datenbank
Zusammenfassung: SQL Server Integration Services (SSIS) kann als effizientes Tool zum Verschieben
von Daten in und aus Windows Azure SQL-Datenbanken, als Teil der ETL-Gesamtlösung (Extrahieren,
Transformieren, Laden) sowie im Rahmen der Datenverschiebung eingesetzt werden. SSIS ist ein
wirkungsvolles Instrument zum Übertragen von Daten zwischen Quell- und Zielsystemen in der Cloud
sowie in einem Hybridszenario zwischen der Cloud und einem lokalen Standort. In diesem Whitepaper
werden folgende Themen behandelt: Best Practices für die Verwendung von SSIS für cloudbasierte
Quellen und Ziele, Planung von SSIS-Projekten, die vollständig in der Cloud ausgeführt werden oder
hybride Datenverschiebungen umfassen, und eine exemplarische Vorgehensweise zur Leistungsoptimierung
bei hybriden Datenverschiebungen mittels horizontaler Skalierung.
Copyright
Die Informationen werden in ihrem derzeitigen Zustand zur Verfügung gestellt. Die in diesem Dokument
enthaltenen Angaben und Ansichten, einschließlich URLs und anderer Verweise auf Internetwebsites,
können ohne vorherige Ankündigung geändert werden. Ihnen obliegt das Risiko der Verwendung.
Einige der hier dargestellten Beispiele werden nur zu Illustrationszwecken bereitgestellt und sind fiktiv.
Ähnlichkeiten mit realen Gegebenheiten sind weder beabsichtigt noch erwünscht.
Mit diesem Dokument erwerben Sie keine Rechte an geistigem Eigentum in Microsoft-Produkten.
Sie können dieses Dokument zu internen Zwecken und als Referenz kopieren und verwenden.
© 2011 Microsoft. Alle Rechte vorbehalten.
2
Inhalt
Einführung..................................................................................................................................................... 5
Projektentwurf .............................................................................................................................................. 5
Problembestimmung und Beschreibung .................................................................................................. 5
Die Bedeutung der Datenverschiebung in Azure ...................................................................................... 6
Wichtige Szenarien bei der Datenverschiebung ....................................................................................... 7
Anfängliches Laden und Migrieren der Daten von der lokalen Umgebung in die Cloud...................... 7
Verschieben der in der Cloud generierten Daten in lokale Systeme .................................................... 8
Verschieben von Daten zwischen Clouddiensten ................................................................................. 9
Vorhandene Tools, Dienste und Lösungen ............................................................................................... 9
SQL Server Integration Services (SSIS) ................................................................................................ 10
SqlBulkCopy-Klasse in ADO.NET .......................................................................................................... 11
Befehlszeilentool BCP.EXE für Massenkopiervorgänge ...................................................................... 12
Azure-Speicher-BLOBs und Warteschlange für Azure-Speicher ......................................................... 12
Entwurfs- und Implementierungsentscheidungen ................................................................................. 13
Entwurf und Implementierung einer ausgeglichenen Architektur ..................................................... 13
Überlegungen zu Datentypen ............................................................................................................. 14
Packen und Bereitstellen von Lösungen ................................................................................................. 15
Erstellen portierbarer Lösungen ......................................................................................................... 15
Verteilung von Paketen und Codekomponenten ............................................................................... 16
Azure SQL-Datenbank als Ziel von Datenverschiebungen .................................................................. 16
Überlegungen zur Architektur .................................................................................................................... 18
Neustart ohne Verlust des Pipelinefortschritts ...................................................................................... 18
Grundprinzip ........................................................................................................................................... 18
Beispiel mit nur einem Ziel ................................................................................................................. 19
Beispiel mit mehreren Zielen .................................................................................................................. 25
Weitere Tipps zu Neustarts..................................................................................................................... 27
Wiederholungslogik ohne manuelles Eingreifen .................................................................................... 29
Integration einer Wiederholungslogik .................................................................................................... 29
3
SSIS-Optionen zur Leistungsoptimierung.................................................................................................... 34
Optimieren der Netzwerkeinstellungen ................................................................................................. 34
Netzwerkeinstellungen ....................................................................................................................... 35
Hinweis: Bevor Sie die Einstellungen der Netzwerkschnittstellenkarte für die Verwendung von
Jumbo Frames ändern, sollten Sie sich vergewissern, dass dieser Frametyp von der
Netzwerkinfrastruktur unterstützt wird. ............................................................................................ 35
SSIS-Paketeinstellungen .......................................................................................................................... 36
Spezielle Überlegungen zu BLOB-Daten ............................................................................................. 38
Leistungsüberwachung in einem verteilten System mithilfe neuer Funktionen in SSIS 2012................ 40
Protokollieren von Leistungsstatistiken .............................................................................................. 40
Anzeigen von Ausführungsstatistiken ................................................................................................. 42
Überwachen des Datenflusses ............................................................................................................ 47
Schlussfolgerung ......................................................................................................................................... 52
4
Einführung
SQL Server Integration Services (SSIS) ist ein effizientes Tool, das zum Verschieben von Daten in und aus
Windows Azure SQL-Datenbanken, als Teil der ETL-Gesamtlösung (Extrahieren, Transformieren, Laden)
oder im Rahmen von Datenverschiebungen, die keine Transformationen erfordern, genutzt werden kann.
SSIS ist für zahlreiche Quellen und Ziele geeignet: in der Cloud, an einem lokalen Standort oder in einer
Hybridumgebung. In diesem Whitepaper werden folgende Themen behandelt: Best Practices für die
Verwendung von SSIS für cloudbasierte Quellen und Ziele, Planung von SSIS-Projekten, die vollständig in
der Cloud ausgeführt werden oder hybride Datenverschiebungen umfassen, und eine exemplarische
Vorgehensweise zur Leistungsoptimierung bei hybriden Datenverschiebungen mittels horizontaler
Skalierung.
Projektentwurf
Projekte, mit denen Daten zwischen cloudbasierten und lokalen Datenspeichern verschoben werden,
können verschiedenartige Prozesse in unterschiedlichen Lösungen umfassen. Hier laufen zahlreiche
Aufgaben zusammen. Vom ersten Auffüllen des Ziels mit Daten aus anderen Systemen oder Plattformen
über Wartungstasks wie das Umverteilen von Datasets auf eine neue Anzahl von Partitionen oder Shards
bis hin zu regelmäßigen Massendatenvorgängen oder Aktualisierungen. Der Projektentwurf und die
Grundannahmen stellen sich bei einer Lösung, die ausschließlich auf Clouddaten basiert, häufig anders
dar als bei einer herkömmlichen Umgebung, in der Daten lokal verschoben werden. Während viele
Erfahrungswerte und Verfahrensweisen weiterhin Gültigkeit besitzen, machen neue Voraussetzungen
ein Umdenken erforderlich, das den Wandel von einer eigenständigen, kontrollierbaren Umgebung zu
einem gemeinsamen Pool von Standardressourcen einläutet. Damit dieser Schritt gelingt, ist ein optimal
abgestimmter und anpassungsfähiger Ansatz erforderlich.
Problembestimmung und Beschreibung
Sowohl für native Lösungen, die von Anfang an für die Cloud entwickelt wurden, als auch für migrierte
Lösungen müssen Daten bewegt werden. Dies geschieht in verschiedenen Phasen des
Anwendungslebenszyklus, beispielsweise in Vorproduktionstests, beim anfänglichen Laden von Daten,
bei nachfolgenden Datensynchronisierungen zwischen cloudgenerierten Daten und den lokalen
Originaldatenbanken sowie beim Erstellen regelmäßiger Momentaufnahmen, die von der Cloud auf
andere lokale Systeme (z. B Data Warehouses) übertragen werden.
5
Abbildung 1 Szenarien für Datenverschiebungen
Der Schwerpunkt dieses Abschnitts ist die anfängliche Datenladephase, d. h., der gesamte Ablauf vom
Extrahieren der Daten aus der Quelldatenbank, über die Umlagerung von der lokalen Umgebung in die
Cloud, bis hin zum Laden der Daten in das endgültige Zielsystem. Es sollte beachtet werden, dass sich
nahezu alle Best Practices und Optimierungen in diesem Whitepaper mit minimalen Modifikationen auf
die meisten hier beschriebenen Szenarien anwenden lassen. Die Szenarien und die zentralen
Fragestellungen werden in den folgenden Abschnitten besprochen.
Die Bedeutung der Datenverschiebung in Azure
Im Vergleich zu einem herkömmlichen Rechenzentrum, in dem es beim Verschieben von Daten zwischen
Anwendungen und Systemen auf Anwendungskompatibilität, Prozessorchestrierung und Synchronisierung
ankommt oder in dem Probleme mit physischen Hardwareressourcen und Netzwerkfunktionalität
bewältigt werden müssen, zeichnen sich Cloudumgebung wie Windows Azure durch eine deutlich
höhere Komplexität aus. Diese drückt sich beispielsweise in der Stabilität, Bandbreite und Latenz der
Verbindungen zwischen lokaler und Cloudumgebung (oder zwischen Clouddiensten) aus. In einer
optimalen Lösung für die Datenverschiebung muss diese Komplexität berücksichtigt werden. Je höher
der Anteil „nicht stationärer“ Teile einer Lösung ist, umso wichtiger wird es, ein ausgewogenes
Verhältnis zwischen allen involvierten Komponenten und Technologien zu schaffen. Das schwächste
Glied in der Kette darf nicht überlastet werden, weil dies negative Auswirkungen auf alle anderen hätte.
6
Tests haben ergeben, dass die Fähigkeit des Datenziels, die von externen Quellen hochgeladene
Datenflut mit einer angemessenen Geschwindigkeit zu bewältigen, eine der Schwachstellen darstellt.
Am besten kann man diesem Problem begegnen, indem die Zieldatenbank mit einem angepassten
Shardingansatz horizontal auf mehrere Back-End-Knoten skaliert wird (http://social.technet.microsoft.com/
wiki/contents/articles/1926.how-to-shard-with-windows-azure-sql-database.aspx). Sobald die zu ladende
Datenmenge eine signifikante Größenordnung erreicht hat (die bei Veröffentlichung dieses Beitrags bei
+20 GB/Stunde lag), wird diese Technik zwingend notwendig und kann sowohl auf Azure SQLDatenbankinstanzen als auch auf SQL Server auf virtuellen Windows Azure-Computern (WA-VMs)
angewendet werden. Da der Datenladevorgang bei diesem Ansatz nicht automatisch linear skaliert wird,
ist es umso wichtiger, ein ausgeglichenes Verhältnis zwischen den übrigen verschiebbaren Teilen der
Lösung herzustellen. In den nächsten Abschnitten werden die wichtigsten Bereiche und Entwurfsoptionen
beschrieben, die zu einem optimalen Endergebnis beitragen.
Wichtige Szenarien bei der Datenverschiebung
Im Folgenden die drei Hauptszenarien, die beim Verschieben von Daten zwischen Quelle und Ziel
erörtert werden. Behandelt werden die am häufigsten aufgetretenen Fragestellungen.



Anfängliches Laden und Migrieren der Daten von der lokalen Umgebung in die Cloud
Verschieben der in der Cloud generierten Daten in lokale Systeme
Verschieben von Daten zwischen Clouddiensten
Anfängliches Laden und Migrieren der Daten von der lokalen Umgebung in die Cloud
SQL-Datenbank oder
SQL Server auf einer VM
Abbildung 2 Szenario für den anfänglichen Datenladevorgang
7
Bei jeder Anwendung, die von einer lokalen Bereitstellung in eine Cloudumgebung umgelagert wird,
muss auch eine bestimmte Datenmenge verschoben werden. Sobald das Datenvolumen eine bestimmte
Grenze erreicht hat, erfordert dieser Vorgang eine andere Herangehensweise als bei lokalen Lösungen.
Dies liegt vor allem an: der Bandbreite und Latenz öffentlicher Netzwerke sowie der Anzahl der für die
Datenladephase (gemeinsam) genutzten Ressourcen auf den physischen Hardwareknoten, die eine
Datenbank (Azure SQL-Datenbank oder WA-VMs) in der Cloudumgebung hosten. Es gibt verschiedene
Möglichkeiten, die Auswirkungen des schlechtesten Performers auf die Gesamtlösung zu mindern, z. B.
indem die ursprünglichen Daten in mehrere Bucketdateien partitioniert und vor der Netzwerkübertragung
komprimiert werden (vgl. Abbildung 2). Die Datenpartitionierung ist auch in der Cloud von Nutzen, da
sie Einfügeprozesse in das Datenziel erleichtert, das häufig über mehrere Azure SQL-DatenbankinstanzShards verteilt ist oder von mehreren WA-VMs gehostet wird.
Sowohl lokal als auch in der Cloud übernimmt SSIS eine wichtige Rolle beim physischen Datenexport
und -import. Die Gesamtlösung erfordert zusätzliche Technologien wie Azure-BLOB-Speicher und Warteschlangen, um Zwischendateiformate zu speichern und die Kopier- und Übertragungsvorgänge
über verteilte SSIS-Importprozesse hinweg zu koordinieren.
Weitere spezifische Informationen zur Migration eines Datenbankschemas und der Objekte zu Azure
SQL-Datenbank finden Sie im Leitfaden Migrieren datenorientierter Anwendungen zu Windows
Azure (http://msdn.microsoft.com/de-de/library/windowsazure/jj156154.aspx).
Verschieben der in der Cloud generierten Daten in lokale Systeme
Dieses Szenario ist eng mit dem vorherigen verknüpft, da der Ladevorgang und Datenfluss aus
technischer Sicht einfach umgekehrt werden, wobei die Gesamtziele jedoch anders gelagert sein
können. Dieses Szenario beinhaltet in der Regel frisch generierte Daten, die in lokalen Systemen wie
Data Warehouses ständig neu abgerufen und geladen werden müssen, oder aber Daten für lokale
Transaktionslösungen. Folglich haben die meisten im vorherigen Abschnitt erwähnten Techniken
und Technologien für dieses Szenario ebenfalls Gültigkeit. Daten werden von SSIS auf der Cloudseite
extrahiert, komprimiert und dann zurück an das lokalen System übertragen, wo die üblichen
Verarbeitungsschritte ausgeführt werden. Weitere Informationen finden Sie im Leistungsleitfaden für
das Laden von Daten (http://msdn.microsoft.com/de-de/library/dd425070(v=SQL.100).aspx).
8
Verschieben von Daten zwischen Clouddiensten
In einigen Szenarien müssen Daten zwischen unterschiedlichen Clouddiensten und -datenbanken
verschoben werden. Dazu gehört der Datenaustausch zwischen verschiedenen Lösungen, die miteinander
interagieren müssen, und die Neuverteilung partitionierter Daten zwischen Tabellen, die in verschiedenen
Shards gehostet werden, wie in Abbildung 3 unten dargestellt.
Abbildung 3 Verschieben von Daten zwischen Datenbankshards
SQL-Datenbank oder SQL Server auf einer VM
Diese Shards können sowohl von Azure SQL-Datenbankinstanzen als auch von SQL Server auf einer
WA-VM gehostet werden, ohne dass der zugrunde liegende Ansatz oder die Architektur angepasst
werden müssen. Anders als in den oben genannten Szenarien werden sämtliche Daten üblicherweise
nur innerhalb der Grenzen einer einzelnen WA-Region bewegt. So kann nicht nur der Einfluss der
Netzwerklatenz auf ein Minimum reduziert, sondern auch auf den Datenexport und -import über einen
Zwischenspeicher (z. B. lokale Datenträger oder Azure-Speicher) verzichtet werden. In einigen Fällen
sind auch regionsübergreifende Datenverschiebungen erforderlich, diese zu erläutern, geht jedoch über
den Rahmen dieses Whitepapers hinaus. Auch wenn sowohl Datenquelle als auch Ziel in einer gemeinsamen
Cloudumgebung gehostet werden, ist eine sorgfältige Abstimmung der Ladephase gerade dann von
entscheidender Bedeutung.
Vorhandene Tools, Dienste und Lösungen
Zur Implementierung der in den vorangehenden Szenarien beschriebenen Lösungen können vorhandene
und neue Tools mit Komponenten und Verfahren kombiniert werden, die lokal wie in der Cloud von
Nutzen sind. In einer Hybridumgebung müssen einige dieser Komponenten im Kontext lokaler,
bereits vorhandener Systeme und Datenquellen ausgeführt werden, während andere von der Nähe
zu den Datenzielen in der Cloud profitieren.
9
SQL Server Integration Services (SSIS)
Als Hauptinstrument für die Datenverschiebung und -integration bietet SSIS zahlreiche Funktionen,
die die meisten Bereiche innerhalb der behandelten Szenarien abdecken. Obwohl nicht speziell für
Hybridumgebungen ausgelegt, können SSIS-Pakete seit Einführung von WA-VMs lokal und in der Cloud
ausgeführt werden und eine direkte Verbindung zwischen beiden Welten schaffen. So kann die DBA/ETL-Entwicklercommunity aus ihrem reichen Erfahrungsschatz schöpfen, weil viele IT-Profis mit dieser
Technologie bereits vertraut sind. Dabei darf aber auch nicht außer Acht gelassen werden, dass nicht
alle mit SSIS implementierten, vorhandenen ETL-Prozesse bei der Umlagerung lokaler Daten in die Cloud
1:1 wiederverwendet werden können.
Je nach Prozesskomplexität, Datenvolumen und Geschwindigkeit sowie den charakteristischen
Unterschieden zwischen cloudbasierten Datenzielen, wie SQL Server auf einer WA-VM und Azure SQLDatenbank, muss die Architektur bis zu einem gewissen Grad umstrukturiert werden.
Es gilt, einige Herauforderungen zu meistern, zum Beispiel das Aneignen von Fachwissen im Umgang mit
Cloudverbindungen zu Windows Azure SQL-Datenbanken oder die Erstellung von SSIS-Paketen zur
Behandlung von Ausfällen und Wiederholungen bei Datenladevorgängen.
Auch die Implementierung von Paketen, die Verbindungen mit partitionierten (auf mehrere Shards
verteilten) Datenzielen herstellen müssen, kann aufwändig sein. Zeitweise werden die Datenbankentitäten
von einer unterschiedlichen Anzahl physischer Knoten gehostet. Partitionierungslogik und Metadaten
müssen verwaltet und aus Anwendungskonfigurationsdateien oder Datenstrukturen abgerufen werden.
Die meisten Funktionen zur Bewältigung dieser Aufgaben sind bereits in die SSIS-Plattform integriert.
Mithilfe von Datenflusskomponenten wie der „Transformation für bedingtes Teilen“ und der
Multicasttransformation lässt sich beispielsweise eine Partitionierungslogik implementieren.
Im Hinblick auf die Architektur gilt es, das neue Design praktisch umzusetzen – entweder mit den
bekannten visuellen Tools oder automatisch, mit einer programmgesteuerten Methode, falls eine
komplexere Lösung benötigt wird. Für die programmgesteuerte Herangehensweise bietet SSIS eine
vollständig skriptfähige Umgebung zur Erledigung zahlreicher Aufgaben: vom Erstellen benutzerdefinierter
Tasks innerhalb der Transformationspipeline bis hin zur Modulinstrumentierung, die bei der Paketausführung
für das Debuggen und die Problembehandlung genutzt werden kann.
Integration Services in SQL Server 2012 umfasst eine vollständige, katalogbasierte Überwachungs- und
Verwaltungslösung, die die Entwicklung verteilter Datenverschiebeprojekte und die Erfassung von
Paketausführungsergebnissen und -statistiken leicht macht.
10
SqlBulkCopy-Klasse in ADO.NET
Wenn ein Problem beim Verschieben von Daten mithilfe einer benutzerdefinierten Datenverschiebelösung
behoben werden soll, ist die SqlBulkCopy-Klasse (http://msdn.microsoft.com/de-de/library/
system.data.sqlclient.sqlbulkcopy.aspx) in der ADO.NET-Datenzugriffsbibliothek zweifellos die beste
Wahl. Die Klasse ist ein schlanker Wrapper für die ODBC-APIs zum Massenkopieren. Sie akzeptiert eine
Datentabelle als Eingabe und eine vorhandene Datenbankverbindung und bietet einen schnellen,
voll konfigurierbaren Ansatz, um Daten in eine SQL Server- oder Azure SQL-Datenbank zu laden.
Bei der Verwendung der SqlBulkCopy-Klasse für die Interaktion mit einem cloudbasierten Datenziel
besteht ein wichtiger Aspekt darin, die herkömmliche, für die Interaktion mit dem Server verwendete
SqlConnection-Klasse (http://msdn.microsoft.com/dede/library/system.data.sqlclient.sqlconnection.aspx) durch die besser geeignete ReliableSqlConnectionKlasse (http://msdn.microsoft.com/de-de/library/
microsoft.practices.enterpriselibrary.windowsazure.transientfaulthandling.sqlazure.reliablesqlconnectio
n(v=pandp.50).aspx) zu ersetzen, die Bestandteil des Anwendungsblocks zur Behandlung
vorübergehender Fehler (http://msdn.microsoft.com/de-de/library/hh680934(v=PandP.50).aspx) ist.
Dadurch wird die Implementierung einer Wiederholungslogik in einem neuen oder vorhandenen
Datenladevorgang erheblich vereinfacht. Ein weiterer Vorteil besteht darin, dass die Bibliothek
standardmäßige und benutzerdefinierte Wiederholungsrichtlinien bereitstellen kann, um unterschiedlichen
Konnektivitätsszenarien gerecht zu werden.
Die in der SqlBulkCopy-Klasse verfügbaren Attribute und Eigenschaften ermöglichen die Anpassung des
Ladevorgangs an praktisch jede Situation. In diesem Artikel wird erläutert, wie Batchgrößen unter
Berücksichtigung folgender Fragestellungen optimiert werden: wo der Datenladeprozess ausgeführt
wird, wie viele Daten vom Prozess importiert werden müssen und welche Verbindung zwischen Prozess
und Datenziel verfügbar ist.
Wenn die Datenmenge in einem einzelnen Batch sehr gering ist, beispielsweise zwischen 10 und 1000 Zeilen
pro Batch liegt, ist die SqlBulkCopy-Klasse weniger für das Laden von Daten in ein Ziel geeignet. Da bei
der SqlBulkCopy-Klasse vor dem eigentlichen Start des Ladevorgangs zunächst eine
Metadatenüberprüfung durchgeführt werden muss, entsteht ein Mehraufwand, der die Gesamtleistung
beeinträchtigen kann. Bei kleinen Batches empfiehlt es sich, alternativ einen Tabellenwertparameter
zum Implementieren des gewünschten Schemas und „INSERT INTO Destination SELECT * FROM @TVP“
zum Laden der Daten zu verwenden.
Ein vollständiges Beispiel zur Verwendung der API zum Massenkopieren finden Sie unter SqlBulkCopyKlasse (http://msdn.microsoft.com/de-de/library/system.data.sqlclient.sqlbulkcopy.aspx).
11
Befehlszeilentool BCP.EXE für Massenkopiervorgänge
Das Befehlszeilentool BCP.EXE (das unter Verwendung derselben APIs zum Massenkopieren wie die
SqlBulkCopy-Klasse erstellt wurde) wird bereits seit Längerem für Massenladevorgänge auf SQL ServerInstanzen eingesetzt. Das Programm ist ein einfaches und dennoch leistungsstarkes Tool zur effizienten
Automatisierung einfacher Datenverschiebelösungen. Einer der Hauptvorteile besteht darin, dass sich
die Toolinstallation auf Azure-Serverknoten oder VMs einfach automatisieren lässt und dass vorhandene
Skripts nach der Anpassung an die Cloudumgebung problemlos weiterverwendet werden können.
Andererseits unterstützt BCP.EXE keine erweiterte Verbindungsverwaltung. Zusätzlich verursacht
BCP.EXE bei der Implementierung zuverlässiger Datenverschiebetasks auf Grundlage von
Wiederholungsvorgängen den gleichen Aufwand wie SSIS, was die Stabilität von Verbindungen
beeinträchtigen und zu Verbindungsabbrüchen führen kann. Im Gegensatz zu den anderen beschriebenen
Tools muss BCP.EXE Daten unter Verwendung physischer Dateien importieren oder exportieren, die sich
auf lokalen, zugeordneten oder angefügten Laufwerken befinden. So können Daten weder direkt
zwischen Quelle und Ziel gestreamt noch programmgesteuert aus unterschiedlichen Quellen gelesen
werden – Voraussetzungen, die SSIS oder SqlBulkCopy-basierte Anwendungen mitbringen.
Azure-Speicher-BLOBs und Warteschlange für Azure-Speicher
Obwohl sie nicht unmittelbar für Datenverschiebungen eingesetzt werden, sind die AzureSpeicherfunktionen unverzichtbar, wenn es darum geht, komplexe Lösungen zu implementieren,
die eine Zwischenspeicherung zwischen lokalen und Cloudprozessen erfordern, oder um Phasen und
Vorgänge zwischen den beiden Umgebungen zu koordinieren. Das leistungsfähige Speicherprinzip von
Azure-Speicher-BLOBs ermöglicht das Laden von Zwischendateien und den Austausch dieser Dateien
zwischen Azure-Serverknoten oder VMs und lokal ausgeführten Anwendungen. Die Warteschlange für
Azure-Speicher ist ein einfaches Messagingtool, mit dem der Zugriff von Datenladeprozessen auf
Dateien und Inhalte, die als Azure-BLOBs gespeichert sind, signalisiert und koordiniert wird.
Azure-Speicher-BLOBs und die Warteschlange für Azure-Speicher lassen sich dank der .NET Azure
Storage Client Library, die eine Reihe einfacher Klassen für die Interaktion mit Speicherkonten, Containern,
BLOBs und ähnlichen Komponenten enthält, leicht in vorhandene Anwendungen integrieren. Die Bibliothek
verbirgt die Details der zugrunde liegenden REST-basierten Schnittstelle und bildet eine Brücke zwischen
lokalen Daten und Clouddaten. Weitere Informationen zur Verwendung der Warteschlange für AzureSpeicher sowie von Azure-Speicher-BLOBs finden Sie unter Verwenden des WarteschlangenspeicherDiensts (http://www.windowsazure.com/en-us/develop/net/how-to-guides/queue-service/) und
Verwenden des Windows Azure-BLOB-Speicherdiensts in .NET (http://www.windowsazure.com/
en-us/develop/net/how-to-guides/blob-storage/).
12
Entwurfs- und Implementierungsentscheidungen
Entwurfs- und Implementierungsentscheidungen im Hinblick auf hybride Datenverschiebelösungen
werden von mehreren Faktoren beeinflusst. Ob es um das Recycling bestehender Artefakte und
Prozesse oder um einen kompletten Neuanfang geht, ist eine der wichtigsten Fragen, die die Wahl der
Architektur beeinflusst. Als Nächstes müssen die Kenntnisse und Fertigkeiten der Mitarbeiter sondiert
werden. (Gibt es z. B. mehr Entwickler oder mehr Datenbankadministratoren im Team?) Ist das Team
fähig, programmgesteuert eine angepasste neue Lösung zu entwickeln, oder sollten besser vorhandene
ETL-Prozesse adaptiert werden? In beiden Fällen ist der Schritt in die Cloud mit Vorüberlegungen verbunden,
weil einige Annahmen, die auf traditionelle lokale Umgebungen zutreffen, in der Cloud nicht mehr gültig sind.
Zudem muss entschieden werden, wo spezifische Datenverschiebetasks und -dienste ausgeführt werden
sollen, z. B. mit der Logik für bedingtes Teilen (Conditional Split), die für Sharding oder Datenkomprimierung
zuständig ist. Abhängig davon, wie die Tasks auf Komponentenebene implementiert werden (SSIS-Pipeline
oder benutzerdefinierte Tasks), können die Komponenten sehr viel CPU-Leistung beanspruchen.
Möglicherweise ist es sinnvoll, Tasks auf Azure-VMs auszulagern und die natürliche Elastizität der
Cloudumgebung auszunutzen, um einen ausgewogenen Ressourcenverbrauch zu gewährleisten.
Gleichzeitig ist es vorteilhafter, die Tasks in unmittelbarer Nähe der zugrunde liegenden Datenquellen
zu platzieren, da die für solche Lösungen kritische Netzwerklatenz so reduziert wird. In einer Planungs- und
Testphase können spezifische Ressourcenengpässe ermittelt und Entscheidungen zur geeigneten
Implementierung der verschiedenen Tasks getroffen werden.
Der mit der Implementierung oder Anpassung einer vorhandenen Lösung an ein Hybridszenario
verbundene Aufwand muss durch die Vorteile der Hybridumgebung gerechtfertigt sein. Um den
richtigen Eindruck zu erhalten und eine Hybridimplementierung erfolgreich umzusetzen, müssen die
technischen Vorteile, die die Umlagerung von Teilen der Lösung in die Cloud birgt, gegen eventuelle
Funktionalitätsverluste abgewogen werden. Die Vor- und Nachteile beziehen sich auf sehr greifbare
Aspekte des Lösungsentwurfs. Wie werden die massiven Skalierungseffekte einer Cloudplattform
optimal genutzt, ohne die Kontrolle über die Hauptkomponenten der Lösung zu verlieren? Wie können
Datenladevorgänge für eine Plattform ausgeführt werden, die für horizontale und nicht für vertikale
Skalierung ausgelegt ist, während trotzdem eine akzeptable, voraussagbare Leistung erzielt wird? Die
Beantwortung dieser Fragen erfordert ein Umdenken. Waren Netzwerkleistung und -zuverlässigkeit
früher immer gegeben und Anwendungskomponenten und -dienste immer verfügbar, müssen
Ressourcen heute bedarfsgesteuert aktiviert werden, um Leistungsproblemen zu begegnen. Die neue
Lösung sollte ausfalltolerant sein, höhere Latenzzeiten als frühere Umgebungen akzeptieren und
Arbeitslasten möglichst auf viele kleine VMs (Virtual Machines) oder Dienste aufteilen.
Entwurf und Implementierung einer ausgeglichenen Architektur
All diese richtungsweisenden Überlegungen sollten in den Entwurf einer komplexen
Datenverschiebelösung mit mehreren nicht stationären Elementen einfließen, allerdings erhebt keine
von ihnen den Anspruch, die perfekte Entsprechung zu herkömmlichen lokalen Komponenten zu sein.
13
Grundsätzlich sollte der Datenverschiebeprozess von der Datenquellenextraktion bis zum Laden der
Daten am Ziel in kleinere asynchrone Einheiten unterteilt und koordiniert werden, um eine bessere
Anpassung an die wesentlich latentere Hybridumgebung zu erzielen. Das richtige Gleichgewicht
zwischen allen Komponenten einer Umgebung zu finden, ist viel wichtiger, als das Optimum aus
einzelnen Komponenten herauszuholen. Selbst einzelne Schritte, wie der Datenladevorgang, müssen
möglicherweise in kleinere Datenströme für unterschiedliche Shards oder physische Datenbanken
partitioniert werden, um die Einschränkungen eines einzelnen Back-End-Knotens in der Azure SQLDatenbankarchitektur zu überwinden.
Da sich einige Systemkomponenten (Azure SQL-Datenbankknoten und das Azure-Speicher-BLOBRepository einer WA-VM, die SQL Server hostet) durch Hochverfügbarkeit, gemeinsame Nutzung und
Mehrinstanzenfähigkeit auszeichnen, entstehen zusätzliche Leistungsprobleme, wenn zu viele Daten auf
einem einzelnen Knoten platziert werden. Beispielsweise könnte die Überlastung des Replikationsmechanismus
ein Leistungsproblem verursachen, das den gesamten Datenladevorgang verlangsamt.
Abbildung 4 Schematische Darstellung einer Architektur mit gleichmäßig verteilten Datenladevorgängen
Überlegungen zu Datentypen
Das Datenbankschema, das Entity Design und die verwendeten Datentypen können den
Datenverschiebeprozess in vielerlei Hinsicht beeinflussen. Wenn Daten für temporäre Zugriffe in AzureBLOBs oder lokale Speicher massengeladen werden, sind Datentypen mit einem höheren Komprimierungsgrad
in der Regel von Vorteil. Wenn Daten vor der Übertragung komprimiert werden, verbessert sich
natürlich die Leistung.
14
Packen und Bereitstellen von Lösungen
Die Implementierung und Bereitstellung einer Lösung, die lokale Rechenzentren und cloudbasierte
Umgebungen verbindet, umfasst normalerweise eine breite Palette von Komponenten und Diensten.
Die Bereitstellung und Konfiguration aller beteiligten Komponenten so weit wie möglich zu
automatisieren, wird noch entscheidender, wenn die Datenverschiebelösung auf mehreren Instanzen
bereitgestellt werden soll. Virtualisierungstechnologien können beim Erstellen eines Masterimages
helfen. Das Masterimage kann die Bereitstellung allgemeiner Dienste vereinfachen, die sowohl lokal als
auch in der Azure-VM-Infrastruktur benötigt werden.
Gleichzeitig bringt die Verwendung von WA-VMs Einschränkungen für Anwendungspakete, abhängige
Pakete und Dienste mit sich, die andere Azure-Serverknoten wie Web- und Workerrollen nicht aufweisen
(zum Beispiel Starttasks).
Wenn Sie bereits Lösungen zur Softwareverteilung nutzen, beispielsweise Produkte aus der Windows
Server- und System Center-Familie, besteht eine andere Möglichkeit darin, Lösungskomponenten und
Pakete so zu verteilen, dass einige Komponenten in der Cloud und andere in der lokalen Umgebung
ausgeführt werden.
Zudem können die verschiedenen Komponenten wie SSIS und das Azure SDK (für den Zugriff auf AzureSpeicherfunktionen) und die Anwendungsinstallationspakete (MSI-Dateien), die für jede in der verteilten
Umgebung ausgeführte VM erforderlich sind, manuell installiert und konfiguriert werden.
Erstellen portierbarer Lösungen
Insbesondere in einer Architektur für horizontales Skalieren ist es wichtig, dass Optionen wie
Verbindungszeichenfolgen, Anmeldeinformationen und alle anderen Konfigurationsoptionen der Lösung
schnell geändert werden können. Dies erfordert in der Regel einen zentralen Konfigurationsmechanismus,
mit dem Informationen abgerufen und an alle an der Datenverschiebung beteiligten Komponenten und
Dienste weitergegeben werden, sodass Änderungen minimalen Aufwand verursachen. Vor diesem
Hintergrund lassen sich sowohl Standardtools wie SSIS als auch benutzerdefinierte Komponenten und
Anwendungen problemlos implementieren. Azure-Speicher eignet sich gut zum Speichern und Verwalten
der Konfigurationsinformationen, weil der Zugriff sowohl lokal als auch in der Cloud problemlos möglich
ist.
Die SSIS-Plattform enthält bereits mehrere Funktionen, wie Konfigurationsdateien und -parameter,
die das Portieren und Skalieren einer Lösung vereinfachen. Zusätzliche Prozesse und Dienste, die die
gesamte Datenverschiebelösung ausmachen, sollten denselben Konfigurationsansatz verfolgen,
damit die Lösung nahtlos zwischen unterschiedlichen Umgebungen portiert werden kann.
15
Verteilung von Paketen und Codekomponenten
Nachdem alle Elemente der Lösung implementiert wurden, muss das richtige Verfahren zur physischen
Verteilung der verschiedenen SSIS-Pakete und Codekomponenten auf zahlreiche Computer gefunden
werden. Noch wichtiger ist jedoch, wie diese Pakete und Codeelemente auf den verschiedenen Servern
und VMs (Virtual Machines) gehostet und ausgeführt werden. Obwohl die native SSIS-Umgebung in SQL
Server 2012 verschiedene Paketspeichertypen und Bereitstellungsmodelle bietet, erfordert die Entwicklung
einer End-to-End-Datenverschiebelösung u. U. alternative Methoden. Wie können
Orchestrierungsdienste/-anwendungen bedarfsgesteuert zur Überwachung und Steuerung des
Datenverschiebeprozesses implementiert werden? Und in welchem Umfang kann die zugrunde liegende
SSIS-Infrastruktur genutzt werden? Das Whitepaper „SQL Server 2012 SSIS für Azure und Datenverschiebung
im Hybridmodell“ enthält ein spezifisches Beispiel zur Komponentenverteilung und -koordination.
Sie finden das Dokument in der MSDN Library unter Microsoft-Whitepapers für SQL Server 2012.
Da einige Funktionen, die die Azure Platform für Web- und Workerrollen bereithält, von WA-VMs und
physischen Windows Server-basierten Servern nicht implementiert werden, sollten diese Komponenten
idealerweise als Windows-Dienste implementiert werden, um sicherzustellen, dass die Prozesse zusammen
mit den verschiedenen Hosts gestartet und unabhängig von einer interaktiven Benutzersitzung auf dem
jeweiligen Computer weiter ausgeführt werden. Die .NET-Plattform macht es sehr einfach, diese
Softwarepakete zu erstellen, zu packen und anschließend unter Verwendung der zuvor beschriebenen
Optionen auf den verschiedenen Hosts zu verteilen und bereitzustellen.
Die Orchestrierungsdienste/-anwendungen interagieren mit verschiedenen externen Komponenten
(Windows Azure-BLOB-Speicher, Warteschlangen usw.), rufen das SSIS-Ausführungsmodul (DtExec.exe)
auf und orchestrieren die Datenlade- und -transformationstasks auf mehreren Hosts oder VMs.
Für die Paketausführung benötigte angepasste Komponenten müssen ebenfalls über mehrere Knoten
verteilt werden.
Mit diesem verteilten Ansatz kann eine robuste, portierbare and flexible Bereitstellungs- und
Ausführungsumgebung aufgebaut werden, die die End-to-End-Datenverschiebelösung in einer
vollständig hybriden Infrastruktur hostet.
Azure SQL-Datenbank als Ziel von Datenverschiebungen
Obwohl SQL Server und Windows Azure SQL-Datenbanken Gemeinsamkeiten aufweisen,
sollten Sie nicht fälschlicherweise als identisch angesehen werden. Einige Unterschiede können die
Anwendungsleistung unter dem Windows Azure SQL-Datenbankdienst im Vergleich zu SQL ServerDatenbanken beeinflussen.
16
Windows Azure SQL-Datenbank ist ein gehosteter Dienst, der eine komplette, mehrinstanzenfähige
Architektur implementiert. Im Gegensatz zu herkömmlichen SQL Server-Implementierungen bietet
Windows Azure SQL-Datenbank Funktionen wie integrierte Hochverfügbarkeit (HA) und automatisierte
Sicherungen und wird auf Standardhardware anstatt auf Großservern ausgeführt. In der Datenbank
wird ein Teil der in lokalen Umgebungen verwendeten Funktionen ausgeführt, darunter
Datenbankkomprimierung, parallele Abfragen, ColumnStore-Indizes, Tabellenpartitionierung usw.
Weitere Informationen zu Funktionseinschränkungen bei Windows Azure SQL-Datenbanken finden Sie
unter Einschränkungen für SQL Server-Funktionen (Windows Azure SQL-Datenbank)
(http://msdn.microsoft.com/de-de/library/windowsazure/ff394115.aspx).
Einer der größten Unterschiede zwischen Windows Azure SQL-Datenbank und SQL Server besteht darin,
dass Windows Azure SQL-Datenbank einen mehrinstanzenfähigen Dienst mit horizontaler Skalierung
verfügbar macht, unter dem die Ressourcen eines oder mehrerer Computer in einem MicrosoftRechenzentrum von verschiedenen Abonnenten genutzt werden. Ziel ist es, die Gesamtarbeitslast durch
die Umlagerung auf unterschiedliche Computer im Rechenzentrum gleichmäßig zu verteilen. Als Computer
werden rackbasierte Standardserver eingesetzt, bei denen ein optimales Preis-Leistungs-Verhältnis vor
der Gesamtperformance kommt. Nicht jeder Windows Azure SQL-Datenbankknoten im Hostingmodell
verwendet hochleistungsfähige Hardware.
Wenn die Kapazität eines einzelnen Computers für eine Kundenanwendung nicht mehr ausreicht,
muss die Anwendung so angepasst werden, dass die Arbeitslast von einem einzelnen Server auf mehrere
Datenbanken (vermutlich mehrere Computer) aufgeteilt wird. Die Flexibilität und Verwaltbarkeit der
Umgebung birgt jedoch einen Nachteil, weil die Anwendung unerwartet auf einen anderen Computer
umgelagert werden kann. Da die Sitzungen zustandslos sind, sollte die Anwendung mit Techniken
ausgestattet werden, die einzelne Fehlerquellen (SPoF) ausschalten. Dazu gehören das Caching auf andere
Ebenen und eine Wiederholungslogik für Verbindungen und Befehle, um Ausfallsicherheit zu gewährleisten.
Darüber hinaus werden die verschiedenen Ebenen einer WA-Infrastruktur nicht im selben Netzwerksubnetz
implementiert, sodass es immer gewisse Latenzunterschiede zwischen Clientanwendungen und Windows
Azure SQL-Datenbanken geben wird, und zwar selbst dann, wenn Anwendungen und Datenbank im
selben physischen Rechenzentrum gehostet werden. Herkömmliche SQL Server-Lösungen zum Laden
von Daten, die viele kleine Abfragen oder Updates ausführen, werden in Windows Azure aufgrund
dieser physischen Netzwerkunterschiede möglicherweise langsamer ausgeführt. Für die früheren Client/Servermodelle gilt dasselbe: Roundtrips zwischen den Ebenen einer Lösung bedürfen besonderer
Aufmerksamkeit, wenn es darum geht, sichtbare Latenzunterschiede zu behandeln.
17
Überlegungen zur Architektur
Eine der häufigsten Herausforderungen bei SSIS-Paketen ist die Behandlung unerwarteter Fehler
während der Ausführung. Zusätzlich stellt sich die Frage, wie die Zeit zum Abschließen eines ETLProzesses verkürzt werden kann, wenn die Verarbeitung nach einem Ausfall fortgesetzt werden muss.
Bei Ablaufsteuerungstasks, beispielsweise im Dateisystem, kann die Ausführung mithilfe von
Prüfpunkten fortgesetzt werden, ohne dass bereits erledigte Aufgaben wiederholt werden müssen.
Vollständige Anweisungen zur Verwendung von Prüfpunkten finden Sie unter Neustarten von Paketen
mit Prüfpunkten (http://msdn.microsoft.com/de-de/library/ms140226.aspx).
Häufig stellt der Datenfluss den größten Teil des SSIS-Pakets dar. Dieser Abschnitt enthält Entwurfsstrategien.
Sie erfahren, wie Sie Pakete erstellen, die automatische Wiederholungen nach Fehlern zulassen, und die
Datenflusspipeline so konfigurieren, dass die Verarbeitung an der Fehlerquelle fortgesetzt werden kann,
ohne dass der gesamte Datenfluss wiederholt werden muss.
Weitere Ausführungen zur Behandlung vorübergehender Fehler der WA-Plattform finden Sie im
Whitepaper „SQL Server 2012 SSIS für Azure und Datenverschiebung im Hybridmodell“. Sie finden das
Dokument in der MSDN Library unter Microsoft-Whitepapers für SQL Server 2012.
Neustart ohne Verlust des Pipelinefortschritts
Pakete sollten so konzipiert sein, dass der Fortschritt der Paketausführung bis zum Auftreten eines
Fehlers nicht verloren geht. Elemente in der Ablaufsteuerung eines Pakets werden mithilfe von Prüfpunkten
abgesichert. Die Fähigkeit, einen Datenfluss verlustfrei neu zu starten, kann jedoch nur direkt beim
Paketentwurf implementiert werden. In diesem Abschnitt wird eine Strategie vorgestellt, bei der der
Datenfluss an der Fehlerstelle neu gestartet und die Paketausführung automatisch wiederholt werden
kann, sodass sie bei einem Verbindungsverlust nicht abbricht. Derartige Verbindungsunterbrechungen
oder kurze Aussetzer einzuplanen, ist besonders bei Datenverschiebungen in oder aus einer WA SQLDatenbank unerlässlich.
Grundprinzip
Obwohl die Leistung bei jeder Art von Datenbewegung relevant ist, sollten Sie abwägen, inwieweit Ihre
Leistungsanforderungen den Verlust des Arbeitsfortschritts bei einem Fehler während der Datenverschiebung
tolerieren.
Wenn Daten verschoben werden, müssen Sie feststellen können, welche Daten bereits am Ziel eingetroffen
sind und welche nicht. Bei reinen Einfügevorgängen reicht dazu meist schon der Primärschlüssel aus. Bei
anderen Daten kann das Datum der letzten Änderung Aufschluss geben. Wie immer die Daten auch geartet
sind, bei der Implementierung eines Neustartmechanismus müssen Sie als erstes wissen, wie Sie die Daten
identifizieren, die bereits am Ziel vorhanden sind, die am Ziel aktualisiert werden müssen und die noch an das
Ziel übermittelt werden müssen. Nachdem alle Voraussetzungen erfüllt sind, können Sie die Daten
segmentieren und sortieren, um nur diejenigen zu verarbeiten, die noch nicht am Ziel sind, oder um den
Aufwand für die in jeder Phase erforderliche Nachbearbeitung zu minimieren.
18
Durch die Segmentierung können Sie leicht nachverfolgen, welche Blöcke verarbeitet wurden, und die
Sortierung zeigt an, welche Datensätze innerhalb eines Blockes bereits verarbeitet wurden. Bei diesem
Ansatz ist es nicht notwendig, jede Quellzeile mit der Zielzeile zu vergleichen, um zu ermitteln, ob der
jeweilige Datensatz verarbeitet wurde.
Komplexere ETL-Prozesse weisen möglicherweise mehrere Stagingumgebungen auf. Jede Stagingumgebung
stellt ein Ziel für eine Phase des ETL-Prozesses dar. In diesem Zusammenhang sollte jede Stagingumgebung
als separates Ziel angesehen werden und jedes Segment des ETL-Prozesses über einen eigenen
Neustartmechanismus verfügen.
Beispiel mit nur einem Ziel
Der einfachste wiederstartbare Datenfluss ist klein und verfügt über eine einzelne ganze Zahl als
Primärschlüssel. Wenn SQL Server die Quelle darstellt, besteht eine Best Practice darin, die aus der
Quelle abgerufenen Daten zu begrenzen. Betrachten Sie die klassische Beispieltabelle aus
AdventureWorks: „Production.TransactionHistory“. Die Tabelle weist folgende Struktur auf:
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 diesem Beispiel enthält die Tabelle eine einzelne ganze Zahl als Primärschlüssel. Wenn die Daten zum
Zeitpunkt der Verschiebung statisch sind oder Tabelleneinfügungen (und keine Updates) ausgeführt
werden, benötigen Sie lediglich den Primärschlüssel, um festzustellen, ob eine Zeile am Ziel angekommen
ist oder nicht. Jeden Primärschlüsselwert mit dem Ziel zu vergleichen, ist relativ zeitaufwändig. Sie sollten
stattdessen strategisch vorgehen und die Daten in der Quelldatei nach der TransactionID-Spalte sortieren.
Sie müssen lediglich wissen, dass Daten der Reihe nach verarbeitet werden und die höchste TransactionID
kennen, für die am Ziel ein Commit ausgeführt wurde.
In einem SSIS-Paket gehen Sie dazu wie folgt vor.
1. Ermitteln Sie die höchste TransactionID am Ziel.
2. Erstellen Sie eine Abfrage, durch die nur Datensätze mit einer TransactionID aus der Quelle
abgerufen werden, die größer als der höchste Wert am Ziel ist.
3. Verwenden Sie in der Quellabfrage eine ORDER BY TransactionID-Anweisung, um
sicherzustellen, dass der Vergleich der höchsten TransactionID auch beim nächsten Paketstart noch
Gültigkeit besitzt.
19
Bei Verwendung einer relationalen Datenquelle können Sie in SSIS mit einem „SQL ausführen“-Task den
höchsten Wert in eine Paketvariable übernehmen. Allerdings besteht die Möglichkeit, dass am Ziel gar
keine Zeilen vorhanden sind.
SELECT MAX(TransactionID) FROM Production.TransactionHistory
Beim Abruf der höchsten TransactionID aus einer leeren Tabelle lautet das Ergebnis NULL. Dies kann
Probleme mit der im Paket verwendeten Logik verursachen. Es empfiehlt sich daher, mit einem „SQL
ausführen“-Task die niedrigste, nicht verarbeitete TransactionID in der Quelle zu ermitteln. Als Nächstes
fragen Sie entweder die höchste TransactionID vom Ziel ab oder verwenden, falls keine vorhanden ist,
einen Wert, der niedriger ist als der kleinste TransactionID-Wert in der Quelle. Erstellen Sie eine
Quellabfrage, mit der nur Datensätze über diesem/größer als dieser Wert abgerufen werden,
und vergessen Sie nicht die ORDER BY TransactionID-Anweisung.
HINWEIS: Obwohl Sie dieselben Ergebnisse erhalten, wenn Sie nur einen Wert aus dem Ziel abrufen und
eine ISNULL-Funktion oder CASE-Anweisung in der WHERE-Klausel der Quellabfrage verwenden, können
insbesondere bei komplexeren Quellabfragen Leistungsprobleme auftreten. Daher sollten Sie auf diese
„Abkürzung“ besser verzichten. Ermitteln Sie stattdessen einen Wert, den Sie sicher als Untergrenze
verwenden können, und erstellen Sie die Quellabfrage mit diesem Wert.
HINWEIS: Wenn SQL Server die Quelle darstellt, muss bei Verwendung einer ORDER BY-Klausel für einen
gruppierten Index keine zusätzliche Sortierung ausgeführt werden. Die Daten sind bereits so sortiert,
dass sie ohne SORT-Befehl abgerufen werden können. Wenn die Daten am Ziel ebenfalls über einen
gruppierten Index für dieselbe Spalte verfügen, werden durch die Sortierung der Quelldaten nicht nur
die Quellabfrage sondern auch Einfügungen am Ziel optimiert. Außerdem wird dadurch die Reihenfolge
der Daten innerhalb der SSIS-Pipeline beibehalten, was einen Neustart des Datenflusses an der Fehlerquelle
ermöglicht.
Verfahren Sie wie folgt, um dieses Beispielpaket zu erstellen.
1. Erstellen Sie ein neues Paket in einem neuen oder vorhandenen Projekt. Benennen Sie das Paket
mit „SimpleRestart“.
2. Erstellen Sie Verbindungs-Manager, um eine Verbindung mit der Quelle und dem Ziel
herzustellen. In diesem Beispiel wird für den Quell- und Zielserver ein OLE DB-VerbindungsManager erstellt.
3. Ziehen Sie einen neuen „SQL ausführen“-Task auf die Ablaufsteuerungsoberfläche, und nennen
Sie ihn „Pull Min TransactionID From Source“.
4. Erstellen Sie eine SSIS-Variable auf Paketebene, und nennen Sie diese
„minTransactionIDAtSource“. Mithilfe dieser Variablen wird der Wert gespeichert, den Sie aus
dem gerade hinzugefügten „SQL ausführen“-Task abrufen. Vergewissern Sie sich, dass der
Datentyp Int32 lautet und dem Wert der TransactionID in der Tabelle entspricht, und legen Sie
einen geeigneten Anfangswert fest.
20
5. Konfigurieren Sie „Pull Min TransactionID From Source“ wie folgt.
a. Bearbeiten Sie den Task, und geben Sie für Verbindung den Verbindungs-Manager für
den Quellserver an.
b. Obwohl Sie SQLStatement in einer Variablen speichern können, belassen Sie
SQLSourceType in diesem Beispiel bei Direkteingabe. Öffnen Sie das Eingabefenster für
SQLStatement, und geben Sie die folgende Abfrage ein:
SELECT ISNULL(MIN(TransactionID), 0) FROM Production.TransactionHistory
HINWEIS: Sie sollten SQL-Abfragen vor der Eingabe in die SSIS-Editoren testen, weil
dadurch das Debuggen vereinfacht wird. Die Fenster des SSIS-Abfrage-Editors bieten
praktisch keine Hilfe zum Debuggen.
Abbildung 5: Konfigurieren des „SQL ausführen“-Tasks zur Suche der niedrigsten TransactionID in der Quelle.
c. Schließen Sie das Fenster SQL-Abfrage eingeben, indem Sie auf OK klicken.
d. Legen Sie die Eigenschaft ResultSet auf Einzelne Zeile fest.
e. Klicken Sie im linken Bereich des Editors für den „SQL ausführen“-Task auf Resultset,
um anzugeben, wie der Wert dieser Abfrage erfasst wird.
f. Klicken Sie auf die Schaltfläche Hinzufügen, um ein Resultset hinzuzufügen.
21
g. Ändern Sie im neuen Resultset den Eintrag unter Ergebnisname in 0. Vergewissern
Sie sich, dass unter Variablenname die (in Schritt 4 erstellte) Variable
User::minTransactionIDAtSource angezeigt wird. In dieser Variablen wird das Ergebnis
der SQL-Abfrage gespeichert.
h. Schließen Sie den Editor für den Task „SQL ausführen“. Nach dem Schließen sollten
keine Fehler für den Task angezeigt werden.
6. Ziehen Sie einen weiteren „SQL ausführen“-Task auf die Ablaufsteuerungsoberfläche. Nennen
Sie diesen Task Pull Max TransactionID from Destination. Verbinden Sie Pull Min TransactionID
From Source mithilfe einer Success-Rangfolgeneinschränkung mit diesem neuen Task.
7. Erstellen Sie eine neue Variable im Bereich des Pakets. Nennen Sie die neue Variable
maxTransactionIDAtDestination. Weisen Sie ihr den Int32-Datentyp, d. h. den Datentyp der
TransactionID, und einen geeigneten Anfangswert zu.
8. Öffnen Sie für den neuen Task den Editor für den Task „SQL ausführen“, und gehen Sie wie folgt vor:
a. Legen Sie ResultSet auf Einzelne Zeile fest.
b. Legen Sie den Verbindungs-Manager für den Zielserver fest.
c. SQLSourceType: Direkteingabe
d. Verwenden Sie für SQLStatement „SELECT ISNULL(MAX(TransactionID), ?) FROM
Production.TransactionHistory“.
HINWEIS: „?“ ist ein Abfrageparameter, dessen Wert vorübergehend festgelegt wird.
e. Schließen Sie den Abfrage-Editor, indem Sie auf OK klicken, und klicken Sie im linken
Bereich des Editors für den Task „SQL ausführen“ auf Parameterzuordnung.
f. Klicken Sie auf Hinzufügen, um einen einzelnen Parameter hinzuzufügen.
i. Wählen Sie für Variablenname den Namen User::minTransactionIDAtSource.
ii. Für Richtung wählen Sie Eingabe.
iii. Der Datentyp sollte LONG lauten, was in diesem Kontext einer 32-Bit-Ganzzahl
entspricht.
iv. Ändern Sie Parametername in 0. Beachten Sie, dass der Wert in 0 geändert
werden muss, da der Zeichenname einen Fehler verursacht.
g. Klicken Sie im linken Bereich auf Resultset. Klicken Sie auf die Schaltfläche Hinzufügen,
um ein neues Resultset hinzuzufügen.
i. Ändern Sie Ergebnisname in 0.
ii. Wählen Sie unter Variablenname den Namen
User::maxTransactionIDAtDestination aus, der der in Schritt 7 erstellten
Variablen entspricht. Diese Variable enthält das Ergebnis der Abfrage, die Sie
nach Ausführung dieses Tasks eingeben.
HINWEIS: Der nächste Schritt richtet sich nach dem Typ der im Datenfluss verwendeten Quelle.
Für eine OLE DB-Quelle kann eine SSIS-Variable mit einer SQL-Anweisung als Abfrage verwendet
werden. Bei einer ADO.NET-Verbindung ist dies nicht möglich, sie kann aber für die Verwendung
eines Paket- oder Projektparameters als Quellabfrage parametrisiert werden. In ersten Beispiel
verwenden Sie eine OLE DB-Quelle mit einer Variablen, die die Quellabfrage enthält.
22
9. Ziehen Sie einen Datenflusstask auf die Ablaufsteuerungsoberfläche. Nennen Sie ihn Main data
move, und verbinden Sie Pull Max TransactionID From Destination mithilfe einer SuccessRangfolgeneinschränkung mit diesem Datenflusstask.
Wenn das Paket an diesem Punkt ausgeführt wird, haben Sie die Werte gespeichert, die Sie zum
Herstellen des Startpunkts für die aktuelle Ausführung benötigen. Anschließend müssen Sie eine
Variable einrichten, die die SQL-Quellabfrage enthält.
10. Erstellen Sie eine neue Variable, deren Bereich auf Paketebene definiert ist. Nennen Sie diese
Variable sourceQuery, und legen Sie den Datentyp auf string fest. Sie verwenden einen
Ausdruck, um den Wert dieser Variablen zur Laufzeit dynamisch abzurufen. Als Grundlage dient
der Wert, den Sie als Startpunkt für die Abfrage bestimmt haben. Verfahren Sie wie folgt.
a. Klicken Sie rechts neben der Spalte Ausdruck auf die Schaltfläche mit den
Auslassungspunkten, um den Ausdrucks-Generator zu öffnen.
b. Erweitern Sie im Ausdrucks-Generator im Fenster oben links den Knoten
Variablen und Parameter. Sie verwenden die in Schritt 7 erstellte Variable
User::MaxTransactionIDAtDestination. Diese sollte in den aufgeführten Variablen
enthalten sein. Die Variable weist den Int32-Datentyp auf, soll jedoch als Teil einer
String-Variablen verwendet werden. Zu diesem Zweck müssen Sie sie in einen
DT_WSTR-Datentyp umwandeln. Erweitern Sie im oberen rechten Bereich den Knoten
Typumwandlungen, und suchen Sie die Typumwandlung (DT_WSTR, <<length>>).
c. Geben Sie unter Ausdruck die Abfrage ein. An den Stellen, an denen Sie den
Variablennamen oder die Typumwandlung hinzufügen müssen, ziehen Sie diese einfach
aus dem entsprechenden Fenster in das Ausdrucksfeld. So vermeiden Sie Tippfehler im
Editor. Erstellen Sie den Ausdruck wie folgt:
„SELECT TransactionID, ProductID, ReferenceOrderID, ReferenceOrderLineID,
TransactionDate, TransactionType, Quantity, ActualCost, ModifiedDate FROM
Production.TransactionHistory WHERE TransactionID > “ + (DT_WSTR, 12)
@[User::maxTransactionIDAtDestination] + „ORDER BY TransactionID“
Beachten Sie, dass der ganzzahlige Wert durch die Typumwandlung in eine Zeichenfolge
mit einer maximalen Breite von 12 Zeichen geändert wird.
Die Breite von 12 Zeichen ist völlig ausreichend für die gesamte Palette an SQL INTWerten, einschließlich negativer Werte, falls erforderlich. Für BIGINT benötigen Sie eine
Breite von 22 Zeichen. Wählen Sie die Größe der Zeichenvariablen entsprechend dem
abgerufenen Datentyp.
Nachdem Sie den Ausdruck eingegeben haben, klicken Sie auf die Schaltfläche
Ausdruck auswerten, um sicherzustellen, dass der Ausdruck von SSIS ordnungsgemäß
analysiert werden kann. Sie werden feststellen, dass der Anfangswert von
„maxTransactionIDAtDestination“ ordnungsgemäß in den ausgewerteten Ausdruck
eingefügt wurde. Dieser Wert wird zur Laufzeit entsprechend festgelegt.
23
Achten Sie darauf, dass die SQL-Anweisung die ORDER BY-Klausel enthält, da bei
relationalen Datenbanken eine garantierte Reihenfolge nur mit ORDER BY gewährleistet
werden kann. Die erstellte Neustartmethode hängt von der Reihenfolge der Schlüsselwerte
ab.
d. Schließen Sie den Ausdrucks-Generator, indem Sie auf die Schaltfläche OK klicken. Die
dynamisch erstellte SQL-Anweisung ist jetzt in der SourceQuery-Variablen gespeichert.
11. Doppelklicken Sie auf den Datenflusstask Main data move, um die Entwurfsoberfläche Datenfluss
zu öffnen.
12. Ziehen Sie eine OLE DB-Quelle auf die Ablaufsteuerungsoberfläche des Datenflusses. Nennen Sie
sie Retrieve from TransactionHistory.
HINWEIS: Da der Name einer Datenflusskomponente keinen Punkt aufweisen darf, ist der
vollständige Name Pull From Production.TransactionHistory nicht zulässig. Wenn Sie für
Tabellennamen keine Unterstriche verwenden, können Sie den Punkt in der SSISBenennungskonvention durch den Unterstrich ersetzen.
13. Doppelklicken Sie auf die Quelle Retrieve From TransactionHistory, um den Quellen-Editor für
OLE DB zu öffnen.
a. Wählen Sie für OLE DB-Verbindungs-Manager den Verbindungs-Manager Quellserver aus.
b. Wählen Sie in der Dropdownliste Datenzugriffsmodus die Option SQL-Befehl aus
Variable aus.
c. Wählen Sie in der Dropdownliste Variablenname die Variable User::sourceQuery aus,
die Sie in Schritt 10 erstellt haben.
d. Klicken Sie auf Vorschau, um sicherzustellen, dass die Abfrage auf dem Quellserver
ausgeführt werden kann.
e. Vergewissern Sie sich im Editor auf der Seite Spalten, dass alle Spalten ausgewählt sind.
f. Klicken Sie auf OK, um den Quellen-Editor für OLE DB zu beenden.
14. Ziehen Sie ein OLE DB-Ziel auf die Ablaufsteuerungsoberfläche. Nennen Sie es
TransactionHistory Destination. Verbinden Sie die Quelle Retrieve From TransactionHistory
mit dem neuen Ziel. Öffnen Sie das Ziel, indem Sie darauf doppelklicken, und konfigurieren Sie
es wie folgt.
a. Wählen Sie in der Dropdownliste OLE DB-Verbindungs-Manager den VerbindungsManager Zielserver aus.
b. Wählen Sie unter Datenzugriffsmodus die Option Tabelle oder Sicht – schnelles Laden
aus, falls nicht bereits geschehen.
c. Wählen Sie unter Name der Tabelle oder Sicht den Namen aus der Dropdownliste aus,
oder geben Sie den Namen des Zielservers ein. In diesem Fall lautet er
Production.TransactionHistory.
24
d. Wenn Sie die oben beschriebene TransactionHistory-Definition verwenden, können Sie
die Standardeinstellungen auf der Seite Verbindungs-Manager zu Demozwecken
beibehalten. Bei Verwendung der AdventureWorks-Datenbank müssen Sie
Identitätswerte beibehalten auswählen.
e. Ordnen Sie im Editor auf der Seite Zuordnungen die Spalten zu.
HINWEIS: In den meisten Fällen empfiehlt es sich, Fehlerzeilen an eine Zieldatei zu
senden und die Ausgabe umzuleiten. Dies ist nicht erforderlich, um einen Neustart in
der Pipeline zu veranschaulichen. Die Schritte zum Erstellen eines Fehlerflusses und
Umleiten von Zeilen finden Sie unter Konfigurieren einer Fehlerausgabe in einer
Datenflusskomponente (http://msdn.microsoft.com/de-de/library/ms140083.aspx).
f. Klicken Sie auf OK, um den Ziel-Editor für OLE DB zu beenden.
15. Führen Sie einen Test durch, indem Sie einen Import starten, beenden und dann neu starten.
Bei jedem Neustart sollte im Datenfluss die nächste zu verschiebende Zeile ausgewählt werden.
Davor liegende Zeilen werden ignoriert.
Sie haben gerade ein einfaches Paket erstellt, das in der Lage ist, den Datenfluss nach einem Fehler neu
zu starten. Das Beispiel zum Entwerfen eines Pakets, mit dem die Ausführung wiederholt werden kann,
basiert auf diesem Paket. Beachten Sie, dass von keinem Task in der Ablaufsteuerung Prüfpunkte
gespeichert werden sollen. Falls es erforderlich ist, das Paket aufgrund eines Fehlers neu zu starten,
müssen die Komponenten Pull Min TransactionID From Source und Pull Max TransactionID From
Destination ausgeführt werden, um genau zu ermitteln, an welcher Stelle die vorherige
Datenflussausführung unterbrochen wurde. Der Entwurf von Paketen, deren Ausführungsfortschritt
ermittelt und Datenfluss neu gestartet werden kann, ist immer von Vorteil, solange anhand der
zugrunde liegenden Daten festgestellt werden kann, an welcher Stelle der Datenfluss unterbrochen
wurde. In Cloudumgebungen, die anfälliger für Netzwerkschwankungen sind, ist diese Vorgehensweise
praktisch unverzichtbar.
Beispiel mit mehreren Zielen
Dieses Prinzip kann auf Datenflüsse mit mehreren Zielen ausgeweitet werden und ist z. B. beim
Verschieben von Daten in ein Shard-Datenmodell, was häufig bei WA SQL-Datenbanken der Fall ist,
hilfreich. In diesen Fällen wird eine bedingte Teilung verwendet, um die einzelnen Zeilen an das richtige
Ziel zu übermitteln. Verweisdaten können mithilfe eines Multicasts an alle Ziele gesendet werden.
Im Folgenden die wichtigsten Prinzipien für den Entwurf wiederstartbarer Pakete.
25


Es ist möglich, dass der Datenfluss in den verschiedenen Zielen bei Auftreten des Fehlers an
unterschiedlichen Stellen unterbrochen wurde. Daher müssen Sie für jedes Ziel den höchsten
eingefügten Schlüsselwert ermitteln. Erstellen Sie für jedes Ziel eine Variable, in die der höchste
Wert eingefügt wird.
Der Ausgangspunkt in der Quelle ist der auf den niedrigsten Schlüsselwert – der erfolgreich an
den Zielorten eingefügt wurde – folgende Datensatz. Beispiel: Wenn der höchste in einen
Shardsatz eingefügte Schlüsselwert wie folgt lautet, muss der Datenfluss in der Quelle mit dem
auf den Schlüsselwert 1000 folgenden Datensatz fortgesetzt werden.
o Shard00-Schlüsselwert 1000
o Shard01-Schlüsselwert 1100
o Shard02-Schlüsselwert 1050
Da die Gefahr besteht, dass Daten mehrfach extrahiert werden, müssen Sie nach jedem Ziel
filtern, um eine Primärschlüsselverletzung zu verhindern. Verwenden Sie eine Transformation
für bedingtes Teilen, um die bereits verarbeiteten Schlüsselwerte herauszufiltern.
Im oben genannten Shardingbeispiel würden Sie die Variablen „maxTransactionIDAtShard00“,
„maxTransactionIDAtShard01“ und „maxTransactionIDAtShard02“ erstellen. Mithilfe der „SQL
ausführen“-Tasks würden Sie die Werte ermitteln, die in den einzelnen Variablen gespeichert
werden sollen. In der Transformation für bedingtes Teilen könnten Sie die Ausgaben „Shard00“,
„Shard01“ und „Shard02“ definieren. Der Ausdruck für die Ausgaben würde wie folgt aussehen.
ShardID == 0 && TransactionID > @[User::maxTransactionIDAtShard00]
ShardID == 1 && TransactionID > @[User::maxTransactionIDAtShard01]
ShardID == 2 && TransactionID > @[User::maxTransactionIDAtShard02]
Falls Zeilen in die Pipeline eingefügt werden, deren Schlüsselwert unter der TransactionID auf
einem bestimmten Shard liegt, der Datensatz jedoch für diesen Shard vorgesehen ist, wird er
nicht gesendet, sodass keine Primärschlüsselverletzungen auftreten. Leiten Sie diese Datensätze
an die Standardausgabe oder eine getrennte Ausgabe um, damit sie nicht weiterverarbeitet werden.
26
Abbildung 2: Eine bedingte Teilung, die für drei Shards und für Neustarts ohne Primärschlüsselverletzungen am Ziel
konfiguriert wurde. Zu Beginn jeder Ausführung wird der höchste Schlüsselwert an jedem Ziel in den
maxTransactionIDAtShardXX-Variablen gespeichert. In der Pipeline werden an diesen Shard gerichtete Zeilen, die einen zu
niedrigen Schlüsselwert aufweisen, nicht an das Ziel gesendet und daher nicht erneut verarbeitet. Diese Zeilen werden an die
Standardausgabe umgeleitet. Da die Standardausgabe nicht verbunden ist, werden sie in der Pipeline nicht weiterverarbeitet.
Weitere Tipps zu Neustarts

27
Wenn das Ziel eine Datei ist, verwenden Sie eine Variable zur Darstellung des Dateinamens.
Wählen Sie aussagekräftige Dateinamen (und fügen Sie z. B. eine Folgenummer oder einen
Timestamp an). Lassen Sie unterschiedliche Datenblöcke in verschiedenen Dateien verarbeiten.
Wenn die Blöcke in derselben Reihenfolge verarbeitet werden und deterministisch definiert
sind, können Sie feststellen, welche Dateien bereits erstellt wurden und so den Startpunkt
bestimmen. Je nach Anforderungen und Logik müssen bereits verarbeitete Dateien u. U.
verschoben, umbenannt oder gelöscht werden.



Umfasst die Quelle mehrere Dateien, verarbeiten Sie jede Datei einzeln und verfolgen,
welche die aktuelle Datei ist. Beim Neustart kann die Verarbeitung nach der zuletzt erfolgreich
verarbeiteten Datei fortgesetzt werden. Mit einer Sortierung nach Dateiname oder Datum
können Sie sicherstellen, dass die Dateien jedes Mal in derselben Reihenfolge verarbeitet
werden, und problemlos die zuletzt erfolgreich verarbeitete Datei ermitteln.
Wenn die Quelle auf SQL Server beruht, können Sie ganzzahlige Werte mit dem SSIS-Datentyp
string abfragen. Solange die Zeichenfolge als SQL Integer umgewandelt werden kann, wird der
Datentyp von SQL während der Optimierung umgewandelt. Nach diesem Prinzip können Sie den
Variablen MaxTransactionIDAtDestination und MinTransactionIDAtSource im Beispielpaket
den String-Datentyp zuweisen, die Eingabeparametertypen in Pull Max TransactionID From
Destination ändern und dieses Paket als Vorlage nutzen, die auch Primärschlüssel in Form von
Buchstaben unterstützt. Verwenden Sie keinen SQL_VARIANT-Datentyp für andere Datentypen
in SQL, da beim Abrufen der minimalen und maximalen Schlüsselwerte ansonsten vollständige
Scans ausgeführt werden.
Wenn die Quelle eine Datei oder eine andere Datenquelle ist, in der keine Abfragen mit WHEREKlauseln oder anderen Filterklauseln möglich sind, verfahren Sie wie folgt.
1. Fügen Sie zwischen der Quell- und Zielkomponente eine Transformation für bedingtes
Teilen ein.
2. Konfigurieren Sie in der bedingten Teilung eine Ausgabe. Bezeichnen Sie diese Ausgabe
mit Trash oder einem anderen Namen, der erkennen lässt, das Sie diese Zeilen nicht
benötigen.
3. Verwenden Sie für die Bedingung, mit der die an das Ziel gesendeten Zeilen abgerufen
werden, einen Ausdruck, um die bereits am Ziel gespeicherten Zeilen herauszufiltern.
Der Ausdruck für das vorherige Beispiel könnte wie folgt lauten.
[TransactionID] <= @[User::maxTransactionIDAtDestination]
4. Verbinden Sie die Ausgabe Trash mit keiner Komponente, sofern diese Zeilen nicht
unbedingt ausgewertet werden müssen. Sie dient lediglich zum Herausfiltern der im
letzten Durchgang verarbeiteten Zeilen.

Dies erspart zwar nicht das Lesen der in dieser Datei bereits verarbeiteten Zeilen,
verhindert jedoch, dass sie erneut an das Ziel übertragen werden und spart so
Netzwerkbandbreite. Da diese Zeilen nicht an das Ziel gesendet werden, müssen dort
keine Daten gelöscht werden.
Bei Verwendung zusammengesetzter Schlüssel bestimmen Sie den genauen Endpunkt mithilfe
korrelierter Unterabfragen. Achten Sie darauf, die Daten nach denselben Schlüsseln zu
sortieren. Im Folgenden ein Beispiel.
SELECT MAX(EmployeeID) AS EmployeeID,
(SELECT MAX(EffectiveDate)
FROM HumanResources.EmployeeHistory i_forDate
28
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
Beachten Sie, was die Reihenfolge in diesem Beispiel bewirkt. Wenn die Datensätze aller
Mitarbeiter (Employees) mit der angegebenen Schlüsselreihenfolge verschoben werden sollen,
ist die Sortierung in Ordnung. Wenn jedoch alle (oder einige) Mitarbeiter am Ziel bereits
vorhanden sind und nur die Änderungen seit dem letzten Import übertragen werden sollen,
müsste nach EffectiveDate, EffectiveSequence und EmployeeID sortiert werden, damit die
Verarbeitung an der Fehlerquelle fortgesetzt werden kann. Mithilfe einer Analyse der zu
importierenden Daten und der richtigen Reihenfolge können Sie den Punkt bestimmen, an dem
die Ausführung wieder aufgenommen werden sollte.
Wiederholungslogik ohne manuelles Eingreifen
Die SSIS-Quell- und -Zielkomponenten weisen keine integrierte Wiederholungslogik auf. Allerdings steht
der SSIS-Paketentwickler der Situation nicht hilflos gegenüber. Pakete, die den Neustart von SSISPaketen ohne Verlust des Datenflussfortschritts unterstützen, bieten auch die Möglichkeit, mit geringem
Mehraufwand einen automatischen Wiederholungsmechanismus zu implementieren. Wenn Daten in
oder aus WA SQL-Datenbanken verschoben werden, sind automatische Wiederholungen u. U. zur
Behandlung vorübergehender Fehlerbedingungen, wie Ressourcen- oder Verbindungseinschränkungen,
erforderlich. Dieser Abschnitt baut auf den Ausführungen im vorherigen Abschnitt auf und enthält ein
Beispiel für eine einfache Wiederholungslogik in Paketen. Anschließend wird ein segmentierter Ansatz
vorgestellt, der die Wiederholung jedes einzelnen Blockes ermöglicht und das Paket widerstandsfähiger
gegen vorübergehende Fehlerbedingungen macht.
Weitere Informationen zu Einschränkungen in SQL finden Sie im Handbuch zur Leistung und Flexibilität
von Windows Azure SQL-Datenbanken (http://social.technet.microsoft.com/wiki/contents/articles/
3507.windows-azure-sql-database-performance-and-elasticity-guide.aspx).
Integration einer Wiederholungslogik
Mithilfe folgender Schritte wird ein Wiederholungsmechanismus in ein einzelnes Paket integriert.
1. Bestimmen Sie, wie häufig die Paketausführung wiederholt werden soll, bevor sie fehlschlägt.
In diesem Beispiel darf eine Komponente höchstens fünfmal wiederholt werden, bevor das
Paket einen Fehler verursacht. Erstellen Sie im Paket eine Variable namens maxNumOfRetries.
Weisen Sie der Variablen, die in Ausdrücken im Paket verwendet wird, den Datentyp int und den
Wert 5 zu.
2. Richten Sie eine Variable ein, in der der Erfolgsstatus gespeichert wird. Erstellen Sie eine neue
Variable im SSIS-Paket, und nennen Sie diese attemptNumber.
29
3. Verwenden Sie eine FOR-Schleife, um die Wiederholungen auszuführen, die bei einem Fehler im
Datenfluss maximal zulässig sind.
4. Fügen Sie den Datenflusstask in die FOR-Schleife ein.
30
5. Legen Sie die Eigenschaft MaximumErrorCount in der FOR-Schleife auf die maximale Anzahl der
für den Datenfluss zulässigen Wiederholungen fest, damit das Paket nach einer erfolgreichen
Wiederholung nicht als fehlerhaft eingestuft wird. Verwenden Sie dazu einen Ausdruck mit der
in Schritt 1 eingerichteten maxNumOfRetries-Variablen.
6. Ermitteln Sie mithilfe der „SQL ausführen“-Tasks die niedrigsten Schlüsselwerte in der Quelle
und die höchsten Schlüsselwerte im Ziel, wie im vorherigen Abschnitt beschrieben. Bei einem
einfachen Wiederholungsszenario kann die Suche in der FOR-Schleife, bei den fortgeschrittenen
Beispielen an anderer Stelle in der Ablaufsteuerung vor der FOR-Schleife erfolgen.
7. Fügen Sie die „SQL ausführen“-Tasks in die FOR-Schleife ein.
8. Verbinden Sie den „SQL ausführen“-Task mithilfe der Success-Einschränkung mit dem
Datenflusstask.
31
9. Verbinden Sie den Datenflusstask mithilfe einer Success-Rangfolgeneinschränkung mit einem
Skripttask, durch den die Variable für den Erfolgsstatus auf true festgelegt wird, um die FORSchleife zu verlassen. Im Folgenden ein Konfigurationsbeispiel für den Skripttask.
32
10. Verbinden Sie den Datenflusstask mithilfe einer Failure-Rangfolgeneinschränkung mit einem
weiteren Skripttask. Konfigurieren Sie den Task mit einem Zeitintervall, das länger als das
häufigste bzw. schwerwiegendste Problem dauert, das eintreten kann. Für dieses Beispiel
werden 10 Sekunden als Puffer festgelegt. Legen Sie den Wert der Success-Variablen auf
false fest.
11. Legen Sie die Eigenschaft FailPackageOnFailure für jeden Task in der FOR-Schleife auf false fest.
In dieser Konfiguration tritt erst ein Paketfehler auf, nachdem die gesamte Anzahl der in der
FOR-Schleife konfigurierten Wiederholungsversuche aufgebraucht und ein Fehler gemeldet wurde.
12. Konfigurieren Sie „SQL ausführen“-Tasks, um nach dem Fehler erneut die niedrigsten
Schlüsselwerte in der Quelle und die höchsten Schlüsselwerte im Ziel zu ermitteln, damit der
Datenfluss fortgesetzt werden kann, ohne dass Arbeit wiederholt werden muss. Konfigurieren
Sie die Tasks, wie unter Neustart ohne Verlust des Pipelinefortschritts beschrieben.
33
Jedes Mal, wenn ein Fehler im Datenfluss auftritt und die maximale Anzahl von Wiederholungen noch
nicht erreicht ist, wird vom Prozess erneut der höchste Schlüsselwert im Ziel gesucht. Der Prozess setzt
die Verarbeitung an dem Punkt fort, an dem im Ziel gerade ein Commit ausgeführt wurde. Wenn der
Datenfluss mehrere Ziele umfasst, beginnen Sie nach dem niedrigsten, sicher im Ziel eingegangenen
Schlüsselwert und behandeln Zeilen, die eine Primärschlüsselverletzung verursachen würden,
mithilfe einer bedingten Teilung oder eines Fehlerflusses.
SSIS-Optionen zur Leistungsoptimierung
Bevor Tipps und Tricks zur ETL-Leistungsoptimierung thematisiert werden, sollten Sie sich noch einmal
vergegenwärtigen, welche Komponenten und verschiebbaren Elemente Ihr Szenario umfasst.
Normalerweise besteht der ETL-Prozess aus folgenden Komponenten:



Datenquelle – liefert Daten
Auf SSIS-Server ausgeführtes Paket – extrahiert Daten aus der Datenquelle, verarbeitet ggf.
Transformationen und lädt Daten in das Ziel
Ziel – empfängt Daten Ein Ziel ist normalerweise eine Datenbank mit den Tabellen, in die die
Daten eingefügt werden.
All diese Schlüsselkomponenten interagieren über die Netzwerkschnittstelle und tauschen Daten
untereinander aus. In einem ersten Schritt der ETL-Leistungsoptimierung sollte sichergestellt werden,
dass das Netzwerk die bestmögliche Leistung erzielt.
Weitere Informationen zum SSIS-Server finden Sie unter Integration Services (SSIS)-Server
(http://msdn.microsoft.com/de-de/library/gg471508.aspx).
Optimieren der Netzwerkeinstellungen
Es gibt zwei Ebenen, die Einfluss auf die Datenübertragung zwischen den oben definierten
Komponenten haben können: die physische Netzwerkkonfiguration und die Verbindungseinstellungen.
34
Netzwerkeinstellungen
Wie viele Daten gleichzeitig über das Netzwerk übertragen werden können, wird durch den
Ethernetframe festgelegt. Jeder Frame wird unter Nutzung von Hardware- und Softwareressourcen
verarbeitet. Unterstützt der Netzwerkadapter eine höhere Framegröße, können mehr Bytes gesendet
werden. Auf diese Weise wird die CPU-Auslastung gesenkt und der Durchsatz erhöht, weil sich auch die
Anzahl der zu verarbeitenden Frames reduziert.
Ein Ethernetframe kann bis zu 9.000 Bytes aufnehmen, was ihn zu einem so genannten Jumbo Frame
macht. Zur Verwendung von Jumbo Frames müssen die Einstellungen der Netzwerkschnittstellenkarten
(NICs) geändert werden. Im folgenden Beispiel wird die Eigenschaft MaxJumboBuffers auf 8192
festgelegt, um die Verwendung von Jumbo Frames zu ermöglichen.
Hinweis: Bevor Sie die Einstellungen der Netzwerkschnittstellenkarte für die Verwendung
von Jumbo Frames ändern, sollten Sie sich vergewissern, dass dieser Frametyp von der
Netzwerkinfrastruktur unterstützt wird.
SQL Server akzeptiert SSIS-Netzwerkpakete mit bis zu 32.676 Bytes. Verfügt eine Anwendung über eine
andere Standardpaketgröße, wird die SQL Server-Einstellung normalerweise von diesem Standardwert
überschrieben. Daher wird empfohlen, die Eigenschaft Paketgröße für den Ziel-Verbindungs-Manager
im SSIS-Paket auf die Standardpaketgröße der Anwendung festzulegen.
Um die Eigenschaft zu bearbeiten, klicken Sie im SSIS-Designer mit der rechten Maustaste auf den
Verbindungs-Manager und klicken dann auf Bearbeiten. Klicken Sie im Dialogfeld Verbindungs-Manager
auf Alle.
35
SSIS-Paketeinstellungen
Neben den Einstellungen für Verbindungszeichenfolgen kann die Verarbeitungsleistung von SQL Server
mit weiteren Einstellungen optimiert werden.
Im SSIS-Datenfluss werden Speicherpuffer für die Datenverarbeitung reserviert. Bei Verwendung dedizierter
Multi-Core-Server mit hoher Arbeitsspeicherkapazität können die Standardspeichereinstellungen für
SSIS häufig angepasst werden, um die Leistungsfähigkeit des SSIS-Servers auszuschöpfen.
Die folgenden SSIS-Speichereinstellungen können angepasst werden.



36
DefaultBufferSize
DefaultBufferMaxRows
EngineThreads
DefaultBufferSize und DefaultBufferMaxRows stehen in Relation zueinander. Das Datenflussmodul
versucht, die Größe der einzelnen Datenzeile zu schätzen. Nachdem diese Größe mit dem in
DefaultBufferMaxRows gespeicherten Wert multipliziert wurde, versucht das Datenflussmodul,
ein entsprechend großes Arbeitsspeichersegment für den Puffer zu reservieren.
[Wert für Puffergröße] = [Größe einer Datenzeile] x [DefaultBufferMaxRows]
Wenn der Wert für die Puffergröße DefaultBufferSize überschreitet, wird die Anzahl der Datenzeilen
vom Datenflussmodul reduziert.
Wenn die intern berechnete Mindestpuffergröße über dem Wert für die Puffergröße liegt, wird die
Anzahl der Datenzeilen vom Datenflussmodul erhöht. DefaultBufferMaxRows wird vom Modul jedoch
nicht überschritten.
Wenn Sie DefaultBufferSize und DefaultBufferMaxRows anpassen, sollten Sie darauf achten,
welche Werte dazu führen, dass das Datenflussmodul Daten auf die Datenträger schreibt. Auf die SSISServerfestplatte ausgelagerte Speicherdaten beeinträchtigen die Leistung bei der SSIS-Paketausführung.
Sie können den Indikator „Gespoolte Puffer“ überwachen, um zu bestimmen, ob Datenpuffer
vorübergehend auf den Datenträger geschrieben werden, während ein Paket ausgeführt wird.
Weitere Informationen zu Leistungsindikatoren für SSIS-Pakete sowie zu Leistungsindikatorstatistiken
finden Sie unter Leistungsindikatoren (http://msdn.microsoft.com/de-de/library/ms137622.aspx).
Die EngineThreads-Einstellung stellt eine Empfehlung für das Datenflussmodul dar und gibt an, wie viele
Threads zum Ausführen eines Tasks verwendet werden können. Bei Verwendung eines Multi-Core-Servers
ist es ratsam, den Standardwert von 10 Threads zu erhöhen. Allerdings verwendet das Modul unabhängig
vom Wert dieser Eigenschaft nicht mehr Threads als nötig. Das Modul verwendet bei Bedarf auch mehr
Threads als in der Eigenschaft angegeben, um Parallelitätsprobleme zu vermeiden. Ein Modulthread pro
Ausführungsstruktur ist ein guter Ausgangswert, der Standardwert 10 sollte jedoch nicht unterschritten
werden.
Weitere Informationen zu den Einstellungen finden Sie unter Funktionen für die Datenflussleistung
(http://msdn.microsoft.com/de-de/library/ms141031.aspx).
37
Spezielle Überlegungen zu BLOB-Daten
Wenn in einer SSIS-Pipeline mehr Daten enthalten sind, als der vordimensionierte Pipelinepuffer
aufnehmen kann, werden die Daten gespoolt. Dies kann besonders bei BLOB-Daten, wie XML-, Textoder Bilddaten, zu Leistungsproblemen führen. Befinden sich BLOB-Daten in der Pipeline, reserviert SSIS
eine Hälfte des Puffers für Daten in Zeilen und die andere Hälfte für BLOB-Daten. Die BLOB-Daten,
die keinen Platz in der einen Pufferhälfte finden, werden gespoolt. Falls BLOB-Daten in der Pipeline
verarbeitet werden, können SSIS-Pakete auf folgende Weise optimiert werden:
1. Ändern Sie den Verweiswert von BLOBTempStoragePath und BufferTempStoragePath in ein
hochleistungsfähiges Laufwerk. Gespoolte Objekte werden standardmäßig in temporäre Dateien
geschrieben, die sich in dem von den Umgebungsvariablen TEMP oder TMP definierten Verzeichnis
befinden. Dieses Verzeichnis befindet sich normalerweise auf dem Betriebssystemlaufwerk,
das erfahrungsgemäß nicht extrem leistungsstark ist. Um sicherzustellen, dass die temporären
Spooldateien auf ein Hochleistungslaufwerk geschrieben werden, ändern Sie den Wert von
BLOBTempStoragePath in den Eigenschaften des SSIS-Datenflusstasks in ein Verzeichnis auf
einem hochperformanten Laufwerk. Dieser Wert kann wie alle SSIS-Eigenschaften mithilfe von
Ausdrücken festgelegt werden.
2. Wählen Sie für DefaultBufferSize und DefaultBufferMaxRows eine Größe, durch die das
Spooling minimiert wird. Da Festplatten normalerweise die langsamste Komponente auf dem
Server bilden und ihre Geschwindigkeit in der Regel nur einen Bruchteil der Prozessor- oder
Arbeitsspeicherleistung ausmacht, kann die ineffiziente Verwendung von Pufferspeicher
manchmal effizienter als das Spoolen von Daten sein. Um das Spoolen von BLOB-Daten im
Datenfluss einzudämmen, bestimmen Sie DefaultBufferSize und DefaultBufferMaxRows
mithilfe einer der folgenden Methoden.
a. Ermitteln Sie MaxBufferSize. Da der Datenfluss BLOB-Daten enthält, ist der maximal
zulässige Wert von 100 MB oder 104.857.600 Bytes ein guter Ausgangswert.
b. Wenn Sie diesen Wert durch 2 dividieren, erhalten Sie in diesem Beispiel 52.428.800
Bytes, was der Hälfte des Puffers entspricht, der für BLOB-Daten reserviert ist.
c. Wählen Sie eine ungefähre Größe für die BLOB-Daten, die in diesem Datenfluss
verarbeitet werden sollen. Eine gute Ausgangsbasis für die Größe ist die durchschnittliche
Länge + 2 Standardabweichungen von der durchschnittlichen Länge aller in einem Puffer
vorgehaltenen BLOB-Daten. Dieser Wert entspricht ca. 98 % aller BLOB-Daten. Da ein
einzelner SSIS-Puffer wahrscheinlich mehr als eine Zeile aufnehmen wird, ist sichergestellt,
dass fast keine Daten gespoolt werden.
38
 Sofern die Quelle unter SQL Server ausgeführt wird, können Sie die Länge mit
folgender Abfrage abrufen.
SELECT CAST
(
AVG(DATALENGTH(ColName))
+ (2 * STDEV(DATALENGTH(Demographics)))
AS INT
) AS Length FROM SchemaName.TableName
 Falls es aufgrund der Tabellengröße nicht möglich ist, zur Ermittlung der
durchschnittlichen und standardmäßigen Abweichung das vollständige
Dataset abzufragen, verwenden Sie eine Methode wie unter Zufällige
Stichprobenentnahme in T-SQL (http://msdn.microsoft.com/de-de/library/
aa175776(v=SQL.80).aspx) beschrieben, um die zu verwendende Länge anhand
einer Stichprobe zu bestimmen.
d. Dividieren Sie den in Schritt b erhaltenen Wert durch den Wert aus Schritt c. Verwenden
Sie das Ergebnis oder einen etwas geringeren DefaultBufferMaxRows-Wert für den
Datenflusstask.
TIPP: DefaultBufferMaxRows und MaxBufferSize können beide mithilfe von Ausdrücken konfiguriert
werden. Dies ist bei Datasets mit BLOB-Daten von Vorteil, deren statistische Länge sich häufig ändert,
oder bei der Erstellung von Vorlagenpaketen, mit denen die Werte zur Laufzeit festgelegt werden.
So konfigurieren Sie die Werte dynamisch.
1. Erstellen Sie eine neue Variable auf Paketebene. Nennen Sie die neue Variable
DefaultMaxRowsInBuffer. Behalten Sie den Int32-Datentyp bei. Um die Eigenschaft
MaxBufferSize dynamisch festzulegen, können Sie eine ähnliche Variable erstellen.
2. Ermitteln Sie den Wert für DefaultBufferMaxRows mithilfe eines „SQL ausführen“-Tasks oder
Skripttasks. Speichern Sie den berechneten Wert in der unter Schritt 1 erstellten
DefaultMaxRowsInBuffer-Variablen.
HINWEIS: Weitere Informationen dazu, wie Sie einen einzelnen Wert mithilfe eines „SQL
ausführen“-Tasks in eine SSIS-Variable übernehmen, finden Sie unter Resultsets im Task „SQL
ausführen“ (http://technet.microsoft.com/de-de/library/cc280492.aspx).
3. Klicken Sie im Eigenschaftenfeld des Datenflusstasks, für den DefaultBufferMaxRows festgelegt
werden soll, auf Ausdrücke, um das Dialogfeld Eigenschaftsausdrucks-Editor zu öffnen.
4. Wählen Sie im Eigenschaftsausdrucks-Editor im Dropdownmenü Eigenschaft die Einstellung
DefaultBufferMaxRows aus, und klicken Sie auf die Schaltfläche mit den Auslassungspunkten,
um den Ausdrucks-Generator zu öffnen.
39
5. Ziehen Sie die in Schritt 1 erstellte Variable aus der Liste Variablen und Parameter in der oberen
linken Ecke in das Feld Ausdruck, und klicken Sie auf Ausdruck auswerten. Daraufhin wird der
Standardwert der Variablen im Feld Ausgewerteter Wert angezeigt.
6. Klicken Sie in den Dialogfeldern Ausdrucks-Generator und Eigenschaftsausdrucks-Editor auf OK,
um die Konfiguration zu speichern. Da die Eigenschaftswerte in dieser Konfiguration zur Laufzeit
festgelegt werden, verringert sich das Risiko, dass BLOB-Daten auf Datenträger gespoolt
werden.
Leistungsüberwachung in einem verteilten System mithilfe neuer Funktionen
in SSIS 2012
Mithilfe neuer Funktionen in SQL Server 2012 kann die Leistung der auf dem SSIS-Server bereitgestellten
Integration Services (SSIS)-Projekte überwacht werden. Sie können die Laufzeitleistung der Paketausführung
protokollieren, Statistiken zur Paketausführung sammeln und den Paketdatenfluss überwachen.
Protokollieren von Leistungsstatistiken
Um anzugeben, in welchem Umfang Informationen während der Paketausführung protokolliert werden
sollen, wählen Sie unter folgenden Protokolliergraden aus. Zur Erfassung von Leistungsstatistiken
wählen Sie den Protokolliergrad Leistung oder Ausführlich aus.
Protokolliergrad Wert
Keiner
0
Standard
40
1
Beschreibung
Die Protokollierung ist deaktiviert. Nur der Paketausführungsstatus wird
protokolliert.
Alle Ereignisse mit Ausnahme benutzerdefinierter und Diagnoseereignisse
werden protokolliert. Dies ist der Standardwert.
Protokolliergrad Wert
Leistung
2
Beschreibung
Nur Leistungsstatistiken sowie OnError- und OnWarning-Ereignisse
werden protokolliert.
Ausführlich
Alle Ereignisse werden protokolliert, einschließlich benutzerdefinierter
Ereignisse und Diagnoseereignisse.
3
Integration Services bietet zahlreiche benutzerdefinierte Ereignisse zum
Schreiben von Protokolleinträgen für Pakete und viele Tasks. Sie können
diese Einträge verwenden, um detaillierte Informationen zum Fortschritt
sowie über die Ergebnisse und Probleme der Ausführung zu speichern,
indem Sie vordefinierte Ereignisse bzw. benutzerdefinierte Meldungen
für die spätere Analyse erfassen.
Weitere Informationen finden Sie unter Benutzerdefinierte Meldungen
für die Protokollierung (http://msdn.microsoft.com/de-de/library/
ms345174.aspx)
Sie können den Protokolliergrad angeben, indem Sie folgende Schritte für eine Paketausführungsinstanz
ausführen.



Festlegen von Parametern für eine Paketausführungsinstanz mit der gespeicherten Prozedur
catalog.set_execution_parameter_value (http://msdn.microsoft.com/de-de/library/ff877990.aspx)
Konfigurieren einer Paketausführungsinstanz mithilfe des Dialogfelds Paket ausführen
Konfigurieren eines SQL Server-Agentauftrags für eine Paketausführung mit dem Dialogfeld
Neuer Auftragsschritt
So legen Sie den Protokolliergrad im Dialogfeld „Paket ausführen“ fest
1.
2.
3.
4.
Navigieren Sie im Objekt-Explorer von SQL Server Management Studio zum Paket.
Klicken Sie mit der rechten Maustaste auf das Paket, und wählen Sie Ausführen aus.
Klicken Sie auf die Registerkarte Erweitert.
Wählen Sie unter Protokolliergrad den Protokolliergrad aus.
So legen Sie den Protokolliergrad im Dialogfeld „Neuer Auftragsschritt“ fest
1. Erstellen Sie einen neuen Auftrag, indem Sie im Objekt-Explorer den Knoten SQL Server-Agent
erweitern, mit der rechten Maustaste auf Aufträge klicken und dann auf Neuer Auftrag klicken.
- oder Ändern Sie einen vorhandenen Auftrag, indem Sie den Knoten SQL Server-Agent erweitern, mit
der rechten Maustaste auf einen vorhandenen Auftrag klicken und dann auf Eigenschaften
klicken.
41
2. Klicken Sie im linken Bereich auf Schritte, und klicken Sie dann auf Neu, um das Dialogfeld
Neuer Auftragsschritt zu öffnen.
3. Wählen Sie im Listenfeld Typ den Eintrag SQL Server Integration Services-Paket aus.
4. Wählen Sie auf der Registerkarte Paket im Listenfeld Paketquelle den Eintrag SSIS-Katalog aus,
geben Sie den Server an, und geben Sie dann den Paketpfad im Feld Paket ein.
5. Klicken Sie auf der Registerkarte Konfiguration auf Erweitert, und wählen Sie dann im Listenfeld
Protokolliergrad einen Protokolliergrad aus.
6. Schließen Sie die Konfiguration des Auftragsschritts ab, und speichern Sie die Änderungen.
Um den Protokolliergrad mit der gespeicherten Prozedur catalog.set_execution_parameter_value
anzugeben, legen Sie parameter_name auf LOGGING_LEVEL und parameter_value auf den Wert für
Leistung oder Ausführlich fest. Im folgenden Beispiel wird eine Ausführungsinstanz für das Paket
Package.dtsx erstellt und der Protokolliergrad auf 2 festgelegt. Das Paket ist im Projekt SSISPackages
und das Projekt im Ordner Packages enthalten.
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
Anzeigen von Ausführungsstatistiken
Die SSISDB-Datenbanksichten, gespeicherte Prozeduren sowie die in SQL Server Management Studio
verfügbaren Standardberichte bieten eine Fülle von Informationen, die nicht nur für Paketausführungen,
sondern auch für Paketausführungsinstanzen relevant sind. Eine Paketausführungsinstanz wird auch als
Ausführung bezeichnet.
Unter den Standardberichten sind Integration Services-Dashboard, Alle Ausführungen und Alle
Verbindungen besonders hilfreich bei der Erfassung von Paketausführungsinformationen.
Der Bericht Integration Services-Dashboard enthält folgende Informationen zu Paketen, die gerade
aktiv sind oder innerhalb der letzten 24 Stunden ausgeführt wurden.
Bericht „Integration Services-Dashboard“
Berichtsabschnitt
Beschreibung
Ausführungsinformationen Zeigt die Anzahl der Ausführungen mit unterschiedlichem Status an
(fehlerhaft, ausgeführt, erfolgreich, sonstige).
Paketinformationen
Zeigt die Gesamtanzahl der Pakete an, die ausgeführt wurden.
Verbindungsinformationen Zeigt die Verbindungen an, die in fehlerhaften Ausführungen verwendet
wurden.
Detaillierte
Zeigt für jedes Paket Details zu abgeschlossenen Ausführungen an.
Paketinformationen
Beispielsweise wird die Anzahl der fehlerhaften Ausführungen im Vergleich
zur Gesamtzahl der Ausführungen, die Dauer der Ausführungen (in Sekunden)
42
Berichtsabschnitt
Beschreibung
und die durchschnittliche Dauer der Ausführungen in den vergangenen
drei Monaten angezeigt.
Um zusätzliche Ausführungsinformationen zu einem Paket anzuzeigen,
klicken Sie auf Ausführungsleistung, Übersicht und Alle Meldungen.
Im Bericht Ausführungsleistung werden die Dauer der letzten 10
erfolgreichen Ausführungen sowie die Aktive Zeit und Gesamtzeit für die
Komponenten des Paketdatenflusses grafisch dargestellt. Die aktive Zeit
bezieht sich auf die gesamte Zeit, die für die Ausführung der Komponente in
allen Phasen benötigt wurde, und die Gesamtzeit bezieht sich auf die
insgesamt verstrichene Zeit für eine Komponente. Der Bericht zeigt diese
Informationen für Datenflusskomponenten nur an, wenn der Protokolliergrad
bei der letzten Paketausführung auf Leistung oder Ausführlich festgelegt war.
Der Bericht Übersicht zeigt den Status von Pakettasks an. Der Bericht
Meldungen zeigt die Ereignismeldungen und Fehlermeldungen für das
Paket und die Tasks an, beispielsweise Meldungen mit den Start- und
Beendigungszeiten sowie die Anzahl der geschriebenen Zeilen.
Der Bericht Alle Ausführungen enthält folgende Informationen zu Ausführungen, die auf der
verbundenen SQL Server-Instanz ausgeführt wurden. Es können mehrere Ausführungen desselben
Pakets existieren. Im Gegensatz zum Bericht Integration Services-Dashboard können Sie den Bericht
Alle Ausführungen für die Anzeige von Ausführungen konfigurieren, die in einem bestimmten
Datumsbereich gestartet wurden. Die Datumsangaben können mehrere Tage, Monate oder Jahre
umfassen.
43
Bericht „Alle Ausführungen“
Berichtsabschnitt
Filter
Ausführungsinformationen
Beschreibung
Zeigt den aktuellen, auf den Bericht angewendeten
Filter an, z. B. den Startzeitraum.
Zeigt Startzeit, Beendigungszeit und Dauer jeder
Paketausführung an.
Sie können eine Liste der bei einer Paketausführung
verwendeten Parameterwerte einsehen,
beispielsweise Werte, die mit dem „Paket
ausführen“-Task an ein untergeordnetes Paket
übergeben wurden. Um die Parameterliste
anzuzeigen, klicken Sie auf Übersicht.
Der Bericht Alle Verbindungen enthält folgende Informationen zu Verbindungen, die bei Ausführungen
auf der SQL Server-Instanz fehlgeschlagen sind.
Berichtsabschnitt
Filter
Details
44
Beschreibung
Zeigt den aktuellen, auf den Bericht angewendeten Filter
an, z. B. Verbindungen mit einer bestimmten Zeichenfolge
und dem Bereich Uhrzeit des letzten Fehlers.
Sie legen den Bereich Uhrzeit des letzten Fehlers fest,
um lediglich Verbindungsfehler anzuzeigen, die in einem
Datumsbereich aufgetreten sind. Der Bereich kann
mehrere Tage, Monate oder Jahre umfassen.
Zeigt die Verbindungszeichenfolge, die Anzahl der
Ausführungen, bei denen ein Verbindungsfehler aufgetreten
ist, und das Datum des letzten Verbindungsfehlers an.
Neben den in SQL Server Management Studio enthaltenen Standardberichten bieten auch die SSISDBDatenbanksichten ähnliche Informationen zu Paketausführungen. In der folgenden Tabelle sind die
wichtigsten Sichten beschrieben.
SSISDB-Datenbanksicht
catalog.executable_statistics
(http://msdn.microsoft.com/de-de/
library/hh479592.aspx)
Beschreibung
Zeigt eine Zeile für jede ausführbare Datei an, die ausgeführt
wird, einschließlich der einzelnen Iterationen einer ausführbaren
Datei. Eine ausführbare Datei ist ein Task oder ein Container,
den Sie der Ablaufsteuerung eines Pakets hinzufügen.
Die Sicht zeigt z. B. an, wie lange die ausführbare Datei
ausgeführt wurde, wann sie in die Phase vor bzw. nach der
Ausführung eingetreten ist und was die Ausführung der Datei
ergeben hat, ob sie beispielsweise erfolgreich oder fehlerhaft war.
catalog.executions
(http://msdn.microsoft.com/de-de/
library/ff878089.aspx)
Ein Beispiel für ein Ausführungsergebnis ist der Rückgabecode
einer gespeicherten Prozedur, die durch einen „SQL ausführen“Task ausgeführt wurde. Weitere Informationen finden Sie unter
Parameter und Rückgabecodes im Task „SQL ausführen“.
Zeigt Informationen zu Paketausführungen an. Mit dem „Paket
ausführen“-Task initiierte Pakete und das übergeordnete Paket
laufen in derselben Ausführung.
Die Sicht zeigt beispielsweise Folgendes an: den Status einer
Ausführung (ausgeführt, fehlerhaft, erfolgreich und sonstige),
den gesamten und auf dem Server verfügbaren physischen
Speicher bei Ausführungsstart sowie den gesamten und
verfügbaren Seiten-Arbeitsspeicher bei Ausführungsstart.
catalog.execution_component_phases Zeigt die Start- und Beendigungszeiten der Datenflusskomponenten
(http://msdn.microsoft.com/de-de/
für jede Ausführungsphase an. Diese Informationen werden für
library/hh230981.aspx)
mehrere Paketausführungen angezeigt.
Die Sicht zeigt diese Informationen für Datenflusskomponenten
nur an, wenn der Protokolliergrad der Paketausführung auf
Leistung oder Ausführlich festgelegt ist.
45
SSISDB-Datenbanksicht
catalog.event_messages
(http://msdn.microsoft.com/de-de/
library/hh479594.aspx)
catalog.event_message_context
(http://msdn.microsoft.com/de-de/
library/hh479590.aspx)
Beschreibung
Zeigt Informationen zu Meldungen an, die während bestimmter
Vorgänge protokolliert wurden, beispielsweise beim Erstellen
und Starten einer Paketausführung. Der Wert für diesen
Vorgangstyp lautet 200.
In der Sicht werden der Meldungstext, die Paketkomponente
und die Datenflusskomponente angezeigt, auf die sich die
Meldung bezieht, sowie das der Meldung zugeordnete Ereignis.
Welche Meldungen in der Sicht für eine Paketausführung
angezeigt werden, richtet sich nach dem für die Ausführung
angegebenen Protokolliergrad.
Zeigt Informationen zu den Bedingungen an, die
Ereignismeldungen für Ausführungen zugeordnet sind.
Die Sicht zeigt beispielsweise das Objekt (Variablenwert oder
Task) sowie den Eigenschaftsnamen und -wert an, die der
Ereignismeldung zugeordnet sind.
Außerdem wird hier die ID jeder Ereignismeldung angezeigt.
Sie können weitere Informationen zu einer bestimmten
Ereignismeldung suchen, indem Sie die
catalog.event_messages-Sicht abfragen.
Mithilfe der catalog.execution_component_phases-Sicht können Sie die in allen Phasen aufgewendete
Ausführungszeit (aktive Zeit) und die insgesamt verstrichene Zeit (Gesamtzeit) für Paketkomponenten
berechnen. Auf diese Weise werden Komponenten identifiziert, die langsamer als erwartet ausgeführt
werden.
Diese Sicht enthält Daten, wenn der Protokolliergrad der Paketausführung Leistung oder Ausführlich
lautet. Weitere Informationen finden Sie unter Protokollieren von Leistungsstatistiken in diesem Artikel.
Im folgenden Beispiel werden die aktive Zeit und die Gesamtzeit für die in der Ausführung enthaltenen
Komponenten mit der ID 33 berechnet. Die Berechnung verwendet die sum-Funktion und DATEDIFFFunktion.
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
46
where execution_id = @execution_id
group by package_name, task_name, subcomponent_name, execution_path
order by active_time desc
Schließlich können mit der dm_execution_performance_counters-Funktion Leistungsindikatorstatistiken
abgerufen werden, z. B. die Anzahl der für eine laufende Ausführung verwendeten Puffer sowie
gelesenen und geschriebenen Zeilen.
Im folgenden Beispiel gibt die Funktion Statistikdaten für eine aktive Ausführung mit der ID 34 zurück.
select * from [catalog].[dm_execution_performance_counters] (34)
Im folgenden Beispiel gibt die Funktion Statistikdaten für alle aktiven Ausführungen zurück.
select * from [catalog].[dm_execution_performance_counters] (NULL)
Überwachen des Datenflusses
Dank den in Integration Services integrierten Funktionen und Tools können Probleme mit einem
Datenfluss in einem Paket während der Ausführung behandelt werden.
47
Abzweigen des Datenflusses während der Ausführung
In der Integration Services-Version von SQL Server 2012 wurde eine neue Funktion eingeführt, mit der
dem Datenflusspfad eines Pakets zur Laufzeit eine Datenabzweigung hinzugefügt und deren Ausgabe an
eine externe Datei weitergeleitet werden kann. Zur Verwendung dieser Funktion muss das SSIS-Projekt
unter Verwendung des Projektbereitstellungsmodells auf einem SSIS-Server bereitgestellt werden. Um
Datenabzweigungen hinzuzufügen, müssen nach der Paketbereitstellung auf dem Server T-SQL-Skripts
für die SSISDB-Datenbank ausgeführt werden, bevor das Paket ausgeführt wird. Hier ein
Beispielszenario:
1. Erstellen Sie mit der gespeicherten Prozedur catalog.create_execution
(http://msdn.microsoft.com/de-de/library/ff878034) eine Ausführungsinstanz des Pakets.
2. Fügen Sie mit der gespeicherten Prozedur catalog.add_data_tap
(http://msdn.microsoft.com/de-de/library/hh230989) oder der gespeicherten Prozedur
catalog.add_data_tap_by_guid (http://msdn.microsoft.com/de-de/library/hh230991) eine
Datenabzweigung hinzu.
3. Starten Sie die Ausführungsinstanz des Pakets mit catalog.start_execution
(http://msdn.microsoft.com/de-de/library/ff878160).
Hier ein SQL-Beispielskript, das die Schritte aus dem oben beschriebenen Szenario ausführt:
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
Die in der gespeicherten Prozedur create_execution verwendeten Parameter für den Ordner-, Projektund Paketnamen entsprechen dem Ordner-, Projekt- und Paketnamen im Integration Services-Katalog.
Sie finden den Ordner-, Projekt- und Paketnamen, der im create_execution-Aufruf verwendet werden
muss, in SQL Server Management Studio (vgl. folgende Abbildung). Wenn das SSIS-Projekt dort nicht
angezeigt wird, haben Sie es möglicherweise noch nicht auf dem SSIS-Server bereitgestellt. Klicken Sie in
Visual Studio mit der rechten Maustaste auf das SSIS-Projekt, klicken Sie auf Bereitstellen, um das
Projekt auf dem erwarteten SSIS-Server bereitzustellen.
48
Anstatt die SQL-Anweisungen manuell einzugeben, können Sie das Paketausführungsskript mit
folgenden Schritten generieren:
1. Klicken Sie mit der rechten Maustaste auf Package.dtsx, und klicken Sie dann auf Ausführen.
2. Klicken Sie auf die Symbolleistenschaltfläche Skript, um das Skript zu generieren.
3. Fügen Sie jetzt die Anweisung add_data_tap vor dem Aufruf start_execution ein.
Der Parameter task_package_path der gespeicherten Prozedur add_data_tap entspricht der Eigenschaft
PackagePath des Datenflusstasks in Visual Studio. Klicken Sie in Visual Studio mit der rechten Maustaste
auf den Datenflusstask, und klicken Sie auf Eigenschaften, um das Eigenschaftenfenster zu öffnen.
Notieren Sie sich den Wert der Eigenschaft PackagePath, um ihn als Wert für den Parameter
task_package_path des Aufrufs der gespeicherten Prozedur add_data_tap zu verwenden.
49
Der Parameter dataflow_path_id_string der gespeicherten Prozedur add_data_tap entspricht der
Eigenschaft IdentificationString des Datenflusspfads, dem Sie eine Datenabzweigung hinzufügen
möchten. Um dataflow_path_id_string abzurufen, klicken Sie auf den Datenflusspfad und notieren sich
den Wert der Eigenschaft IdentificationString im Eigenschaftenfenster.
Wenn Sie das Skript ausführen, wird die Ausgabedatei in <Programme>\Microsoft SQL Server\110\DTS\
DataDumps gespeichert. Wenn bereits eine Datei mit demselben Namen vorhanden ist, wird eine neue Datei
mit einem Suffix (beispielsweise output[1].txt) erstellt.
Wie zuvor erwähnt, können Sie anstelle der gespeicherten Prozedur add_data_tap auch die gespeicherte
Prozedur catalog.add_data_tap_by_guid (http://msdn.microsoft.com/de-de/library/hh230991) verwenden.
Diese gespeicherte Prozedur verwendet die ID des Datenflusstasks und nicht task_package_path als
Parameter. Sie finden die ID des Datenflusstasks im Eigenschaftenfenster von Visual Studio.
Entfernen einer Datenabzweigung
Sie können eine Datenabzweigung vor Beginn der Ausführung mit der gespeicherten Prozedur
catalog.remove_add_data_tap entfernen. Diese gespeicherte Prozedur verwendet die ID der
Datenabzweigung als Parameter, die von der gespeicherten Prozedur add_data_tap ausgegeben wird.
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
Auflisten aller Datenabzweigungen
In der Sicht catalog.execution_data_taps können Sie alle Datenabzweigungen auflisten. Im folgenden
Beispiel werden Datenabzweigungen für eine bestimmte Ausführungsinstanz extrahiert (ID: 54).
select * from [SSISDB].[catalog].execution_data_taps where
execution_id=@execid
Leistungsaspekte
Durch die ausführliche Protokollierung und zusätzliche Verwendung von Datenabzweigungen erhöhen
sich die von der Datenintegrationslösung ausgeführten E/A-Vorgänge. Daher ist es ratsam,
Datenabzweigungen nur zur Fehlerbehebung einzusetzen.
Überwachen des Datenflusses während der Ausführung
Der Datenfluss von Paketen kann mit der SSISDB-Datenbanksicht catalog.execution_data_statistics
(http://msdn.microsoft.com/de-de/library/hh230986.aspx) analysiert werden. In dieser Sicht wird
immer dann eine Zeile angezeigt, wenn eine Datenflusskomponente Daten an eine
Downstreamkomponente sendet. Die Informationen geben detaillierten Aufschluss über die an die
einzelnen Komponenten gesendeten Zeilen.
Hinweis: Damit Informationen mit der Sicht catalog.execution_data_statistics erfasst werden, muss der
Protokolliergrad auf Ausführlich festgelegt werden.
Im folgenden Beispiel wird die Anzahl der Zeilen angezeigt, die zwischen Komponenten eines Pakets
gesendet wurden. Die execution_id entspricht der ID einer Ausführungsinstanz, die Sie dem Rückgabewert
der gespeicherten Prozedur create_execution oder der Sicht catalog.executions entnehmen können.
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
Im folgenden Beispiel wird die Anzahl der Zeilen pro Millisekunde berechnet, die von jeder Komponente
für eine bestimmte Ausführung gesendet wurden. Die berechneten Werte lauten wie folgt:



total_rows: die Summe aller von der Komponente gesendeten Zeilen
wall_clock_time_ms: die insgesamt für jede Komponente aufgewendete Ausführungszeit in
Millisekunden
num_rows_per_millisecond: die Anzahl der von jeder Komponente gesendeten Zeilen pro
Millisekunde
Die HAVING-Klausel verhindert in Berechnungen Fehler aufgrund von Divisionen durch 0 (null).
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
Schlussfolgerung
SQL Server Integration Services (SSIS) kann als effizientes Tool zum Verschieben von Daten in und aus
Windows Azure SQL-Datenbanken, als Teil der ETL-Gesamtlösung (Extrahieren, Transformieren, Laden)
sowie im Rahmen der Datenverschiebung eingesetzt werden. SSIS ist ein wirkungsvolles Instrument zum
Übertragen von Daten zwischen Quell- und Zielsystemen in der Cloud sowie in einem Hybridszenario
zwischen der Cloud und einem lokalen Standort. In diesem Whitepaper wurden folgende Themen
behandelt: Best Practices für die Verwendung von SSIS für cloudbasierte Quellen und Ziele, Planung von
SSIS-Projekten, die vollständig in der Cloud ausgeführt werden oder hybride Datenverschiebungen
umfassen, und eine exemplarische Vorgehensweise zur Leistungsoptimierung bei hybriden
Datenverschiebungen mittels horizontaler Skalierung.
52
Weitere Informationen:
http://www.microsoft.com/sqlserver/: SQL Server-Website
http://technet.microsoft.com/de-de/sqlserver/: SQL Server TechCenter
http://msdn.microsoft.com/de-de/sqlserver/: SQL Server DevCenter
War dieses Dokument hilfreich? Geben Sie uns Ihr Feedback. Bewerten Sie dieses Dokument
auf einer Skala von 1 (schlecht) bis 5 (ausgezeichnet), und begründen Sie Ihre Bewertung.
Beispiel:


Bewerten Sie es hoch aufgrund guter Beispiele, ausgezeichneter Screenshots, klarer
Formulierungen oder aus einem anderen Grund?
Bewerten Sie es niedrig aufgrund schlechter Beispiele, ungenauer Screenshots oder
unklarer Formulierungen?
Dieses Feedback hilft uns, die Qualität von veröffentlichten Whitepapers zu verbessern.
Feedback senden
53
Herunterladen