Benutzer mit den meisten Antworten
Lösungsvorschlag für die Definition einer Ablaufsteuerung

Frage
-
Hallo zusammen,
ich möchte eine Ablaufsteuerung definieren und bin mir nicht sicher wie ich das am besten realisieren kann.
Sachverhalt:
1.) In SQL Server 2008 CDC für eine Tabelle (Kunde) aktiviert (sys.sp_cdc_enable_db / sys.sp_cdc_enable_table etc.). SQL Server erstellt die Tabelle (Kunde_CT)
2.) In einem ETL-Tool habe ich einen ETL-Job definiert, der sobald gestartet, die veränderten Daten in eine Zieltabelle lädt
Meine Frage:
Wie kann ich ein Automatismus definieren, der sobald sich irgendwas in der Tabelle Kunde (somit auch in Kunde_CT) verändert hat, den ETL-Job startet?
Mein erster Gedanke:
1.) Einen Job in SQL Server definieren der den ETL-Job startet
2.) Trigger für die Tabelle "Kunde" erstellen, der den Job startet, sobald sich da was tut
Aber: Im inet wird von dieser Lösung abgeraten. Jetzt habe ich keine Vorstellung wie ich so was sonst realisieren könnte. Freue mich über jeden Denkanstoß. Andere Lösungen wie Service-Broker, Replication Server etc. habe ich googlen können, mir fehlt jedoch die Vorstellung wie?
Vielen Dank und viele Grüße
Abgoosht
- Bearbeitet Robert BreitenhoferModerator Donnerstag, 4. August 2011 11:52 Formatierung
Antworten
-
Eine Latenzzeit von 15 min. ist vertretbar. Nach meinem Verständnis schlagen Sie vor, einen Job im SSMS zu erstellen der alle 15 Min. den ETL-Prozess triggert.
Hallo Abgoosht,wenn 15 min ok sind, würde ich es genau so umsetzten. Auf eine bestimmte Anzahl (wie 500) von Änderungen zu warten, halte ich für unglücklich. Stell Dir mal vor, es werden in einem Zeitraum 499 Datensätze geändert und dann tut sich längere Zeit nichts; die Änderungen würden nicht abgearbeitet werden, bis dann irgendwann Nr. 500 kommt.
Mit "ETL per T-SQL" meinte ich einfache Transformationen die man per T-SQL erledigen kann und kein SSIS Packet dafür benötigt; also Fälle wo in der gleichen DB Daten weg geschrieben oder aktualisiert werden sollen. Wenn sie sehr einfach & schnell erledigt sind, könnte man sie direkt im Trigger abarbeiten; oder man führt diese asynchron über einen Service Broker aus, aus dem Trigger sendet man nur eine Nachricht an den Service Broker.
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing- Als Antwort vorgeschlagen Falk Krahl Freitag, 1. Juli 2011 10:00
- Bearbeitet Robert BreitenhoferModerator Donnerstag, 4. August 2011 12:39 Formatierung
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 4. August 2011 12:39
Alle Antworten
-
Wie kann ich ein Automatismus definieren, der sobald sich irgendwas in der Tabelle Kunde (somit auch in Kunde_CT) verändert hat, den ETL-Job startet?
Hallo Abgoosht,wie konkret soll das ablaufen? Wenn es innerhalb 5 Minuten 1000 Änderungen durchgeführt werden, soll dann 1000 mal der Job gestartet werden? Das wäre in meinen Augen sehr ineffizient.
Die Frage ist natürlich, wie zeitnah die Änderungen weiter verarbeitet werden soll und die zweite wie komplex der ETL Prozess ist.
- Wenn eine Latenz von 15 min vertretbar ist, dann würde ich alle 15 min einen Job laufen lassen, der die aufgelaufenen Änderungen abarbeitet.
- Wenn der ETL Prozess sehr einfach ist und kaum Zeit benötigt, könnte man es per T-SQL im Trigger erledigen.
- Muss die komplexe Verarbeitung sehr zeitnah erfolgen, bietet sich in der Tat der Service Broker an. Im Trigger sendet man eine Nachricht (z.B. nur die ID des Änderungssatzes) in eine Queue. Der Queue Worker arbeitet dann asynchron die Daten ab; liegt ein hohes Aufkommen an, kann man den Queue Worker automatisch skalieren lassen, so das z.B. n Worker gleichzeitig laufen, geht die Last zurück, wird die Anzahl automatisch gedrosselt. Für Aufgaben, die sich nicht in T-SQL / SSIS erledigen lassen, kann man einen External Activator (SSBAE) einsetzten; das kann ein .NET oder sonstiges Programm sein.Letzte Variante setzte ich gerade in 2 aktuellen Projekten um (ohne SSIS); funktioniert gut.
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing -
Wie kann ich ein Automatismus definieren, der sobald sich irgendwas in der Tabelle Kunde (somit auch in Kunde_CT) verändert hat, den ETL-Job startet?
Hallo Abgoosht,wie konkret soll das ablaufen? Wenn es innerhalb 5 Minuten 1000 Änderungen durchgeführt werden, soll dann 1000 mal der Job gestartet werden? Das wäre in meinen Augen sehr ineffizient.
Die Frage ist natürlich, wie zeitnah die Änderungen weiter verarbeitet werden soll und die zweite wie komplex der ETL Prozess ist.
- Wenn eine Latenz von 15 min vertretbar ist, dann würde ich alle 15 min einen Job laufen lassen, der die aufgelaufenen Änderungen abarbeitet.
- Wenn der ETL Prozess sehr einfach ist und kaum Zeit benötigt, könnte man es per T-SQL im Trigger erledigen.
- Muss die komplexe Verarbeitung sehr zeitnah erfolgen, bietet sich in der Tat der Service Broker an. Im Trigger sendet man eine Nachricht (z.B. nur die ID des Änderungssatzes) in eine Queue. Der Queue Worker arbeitet dann asynchron die Daten ab; liegt ein hohes Aufkommen an, kann man den Queue Worker automatisch skalieren lassen, so das z.B. n Worker gleichzeitig laufen, geht die Last zurück, wird die Anzahl automatisch gedrosselt. Für Aufgaben, die sich nicht in T-SQL / SSIS erledigen lassen, kann man einen External Activator (SSBAE) einsetzten; das kann ein .NET oder sonstiges Programm sein.Letzte Variante setzte ich gerade in 2 aktuellen Projekten um (ohne SSIS); funktioniert gut.
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing
Hallo Olaf,
vielen Dank für die ausführliche Antwort.
Eine Latenzzeit von 15 min. ist vertretbar. Nach meinem Verständnis schlagen Sie vor, einen Job im SSMS zu erstellen der alle 15 Min. den ETL-Prozess triggert.
Könntest Du vielleicht konkreter schreiben was Du mit "ETL Prozess per T-SQL triggern" meinst? Ein trigger der den gesamten ETL-Prozess ansteuert, so wie ich es oben beschrieben habe?
Könnte eine mögliche Lösung so aussehen, dass sobald sich z.B. 500 Datensätze in der Tabelle verändern, ein Trigger den SQL-Job startert, der seinerseits den ETL-Prozess startet? Wie könnte man so ein szenario realisieren? Wie kann die Lösung eines Triggers aussehen, der nach 500 veränderten Datensätzen einen SQL-Job startet?
Vielen Dank und viele Grüße
Abgoosht
-
Eine Latenzzeit von 15 min. ist vertretbar. Nach meinem Verständnis schlagen Sie vor, einen Job im SSMS zu erstellen der alle 15 Min. den ETL-Prozess triggert.
Hallo Abgoosht,wenn 15 min ok sind, würde ich es genau so umsetzten. Auf eine bestimmte Anzahl (wie 500) von Änderungen zu warten, halte ich für unglücklich. Stell Dir mal vor, es werden in einem Zeitraum 499 Datensätze geändert und dann tut sich längere Zeit nichts; die Änderungen würden nicht abgearbeitet werden, bis dann irgendwann Nr. 500 kommt.
Mit "ETL per T-SQL" meinte ich einfache Transformationen die man per T-SQL erledigen kann und kein SSIS Packet dafür benötigt; also Fälle wo in der gleichen DB Daten weg geschrieben oder aktualisiert werden sollen. Wenn sie sehr einfach & schnell erledigt sind, könnte man sie direkt im Trigger abarbeiten; oder man führt diese asynchron über einen Service Broker aus, aus dem Trigger sendet man nur eine Nachricht an den Service Broker.
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing- Als Antwort vorgeschlagen Falk Krahl Freitag, 1. Juli 2011 10:00
- Bearbeitet Robert BreitenhoferModerator Donnerstag, 4. August 2011 12:39 Formatierung
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 4. August 2011 12:39