Kürzlich erhielten wir von einem Partner die Anfrage, wie der Massenimport von externen Daten möglichst schnell durchgeführt werden kann. Hierbei handelte es sich konkret um den Import von 927 Millionen Datensätzen. Diese lagen in verschiedenen .csv-Dateien vor. Im folgenden Artikel möchte ich Ihnen aufzeigen, wie wir diesen Vorgang optimieren konnten.
Lokaler Client:
Als erstes wurde die Importprozedur über einen lokalen Client gestartet. Die hier erzielte Einlesegeschwindigkeit lag bei ca. 5,5 Millionen Datensätze pro Stunde. Um alle Datensätze in die Datenbank zu übertagen wurden ca. 168 Stunden benötigt, was einem Zeitraum von 7 Tagen entspricht.
Client auf dem Server:
Um den Einlesevorgang zu beschleunigen, haben wir uns überlegt, wie man den Netzwerk-Traffic vermeidet. Dieser tritt immer dann auf, wenn die zu verarbeitenden Daten von der Workstation an den Server gesendet werden. Als Lösung bot sich an, die Import-Prozedur innerhalb des Clients direkt auf dem Server-Rechner auszuführen. Zusätzlich wurden die .csv-Dateien ebenfalls auf das Server-System übertragen. Hier wurde eine Geschwindigkeit von 9,5 Millionen Datensätzen pro Stunde erreicht. Es verstrichen ca. 98 Stunden, bis alle Datensätze eingelesen waren. Der Zeitraum hier entspricht in etwa 4 Tage.
Remote-Prozedur direkt auf Server:
Sowohl der CONZEPT 16-Client als auch der CONZEPT 16-Server laufen innerhalb des Betriebssystems in einen eigenen Prozess. Die Kommunikation zwischen diesen Komponenten erfolgt über TCP/IP. Der CONZEPT 16-Client sendet folglich die Daten an den CONZEPT 16-Server, dieser verarbeitet diese und sendet ein Resultat zurück. Um diesen Datentransfer zwischen Client und Server zu umgehen, wurde nun die Import-Prozedur als Remote-Prozedur direkt innerhalbs des Datenbankserver-Prozesses ausgeführt. Die nun erreichte Einlesegeschwindigkeit lag bei 30 Millionen Datensätzen pro Stunde, d.h. nach ca. 31 Stunden sind alle Datensätze eingelesen worden.
Zwei Remote-Prozeduren auf Server:
Um eine weitere Steigerung der Verarbeitungsgeschwindigkeit zu erreichen wurde im nächsten Schritt der Vorgang des Einlesens parallelisiert. Hierfür wurden zwei Remote-Prozeduren parallel auf dem Server aufgerufen. Unter Verwendung dieser Vorgehensweise wurden 47,5 Millionen Datensätze pro Stunde eingelesen. Die Dauer bis alle Daten eingelesen waren, lag bei 19,5 Stunden.
Drei und mehr Remote-Prozeduren auf Server:
Im folgenden wurde die Anzahl von parallelen Prozeduren zuerst auf drei, vier und anschließend auf fünf Remote-Prozeduren erhöht. Das optimale Ergebnis wurde bei vier Remote-Prozeduren erreicht. Die Einlesegeschwindigkeit lag nun bei 74,5 Millionen Datensätzen pro Stunde. Nach ca. 12,5 Stunden wurden alle Datensätze übertragen.
Beim Versuch mit mehr als vier Remote-Prozeduren sank die Geschwindigkeit wieder ab. Der Grund dafür findet sich in den vermehrt auftretenden Sperrkonflikten. Diese treten dadurch auf, dass die parallel laufenden Prozeduren auf gemeinsame Ressourcen zugreifen, beispielsweise auf den Datenbankpuffer. Bei einem auftretenden Sperrkonflikt muss die Operation unter Umständen durch den CONZEPT 16-Server wiederholt werden, dies nimmt zusätzliche Zeit in Anspruch. Da jede Remote-Prozedur innerhalb eines eigenen Threads ausgeführt wird, ist ein System mit mehreren Prozessor-Cores Voraussetzung für die Parallelisierung. Die Threads der Remote-Prozeduren werden vom Betriebssystem den einzelnen Cores zugeordnet und dort verarbeitet. Aus diesem Grund würde das Ausführen von zwei Remote-Prozeduren auf einem Single-Core-System zu keiner Geschwindigkeitssteigerung gegenüber einer einzelnen Remote-Prozedur führen.
Zur Information:
Da die Verabeitungsgeschwindigkeit wesentlich von der Größe des Datenbankpuffers abhängig ist, wurde dieser auf das Maximum des CONZEPT 16-Servers gesetzt.
3 Antworten
Ja genau.
@tsauter
…da sieht man, was die neueste Hardware an Verbesserung bringen kann 🙂 Unsere Testmaschine ist von Anfang 2010, mit 2x XEON 5630 und 2,53 GHz, betrieben mit Windows Server 2012.
Ich vermute, dass ihr Server mit 3,4 GHz-Prozessor und unter Linux läuft?
Nochmals Danke dafür! Im konkreten Fall wurden die Daten auf einer Maschine mit Quad-Core, SSD Raid10 und 64GB Hauptspeicher in ziemlich genau 6 Stunden eingelesen.