7 Stimmen

Paralleles Bulk-Inserting mit SqlBulkCopy und Azure

Ich habe eine Azure-App in der Cloud mit einer Azure-SQL-Datenbank. Ich habe eine Arbeiterrolle, die Parsing + Verarbeitung auf eine Datei (bis zu ~ 30 Millionen Zeilen) tun muss, so dass ich nicht direkt BCP oder SSIS verwenden kann.

Ich verwende derzeit SqlBulkCopy, aber das scheint zu langsam zu sein, da ich Ladezeiten von bis zu 4-5 Minuten für 400k Zeilen gesehen habe.

Ich möchte meine Masseneinfügungen parallel ausführen. Wenn ich jedoch die Artikel zum parallelen Importieren von Daten und zur Steuerung des Sperrverhaltens lese, heißt es, dass für SqlBulkCopy erforderlich ist, dass die Tabelle keine geclusterten Indizes hat und ein Tablelock (BU-Lock) angegeben werden muss. Azure-Tabellen müssen jedoch einen geclusterten Index haben...

Ist es überhaupt möglich, SqlBulkCopy parallel für dieselbe Tabelle in SQL Azure zu verwenden? Wenn nicht, gibt es eine andere API (die ich im Code verwenden kann), um dies zu tun?

5voto

Matt Warren Punkte 10169

Ich weiß nicht, wie Sie schneller als mit SqlBulkCopy ausgeführt werden können. In unserem Projekt können wir 250.000 Zeilen in etwa 3 Minuten importieren, also scheint Ihre Geschwindigkeit ungefähr richtig zu sein.

Ich glaube nicht, dass eine parallele Bearbeitung hilfreich wäre, selbst wenn sie technisch möglich wäre. Wir führen jeweils nur einen Import durch, da SQL Azure sonst unsere Anfragen zeitlich begrenzt.

In der Tat ist es manchmal nicht möglich, eine große Group-by-Abfrage gleichzeitig mit dem Import durchzuführen. SQL Azure unternimmt viel, um die Servicequalität zu gewährleisten. Dazu gehört auch die zeitliche Begrenzung von Anfragen, die zu lange dauern, zu viele Ressourcen beanspruchen, usw.

Wenn Sie also mehrere große Beilagen zur gleichen Zeit einlegen, werden wahrscheinlich eine Zeitüberschreitung verursachen.

2voto

Herve Roggero Punkte 4931

Es ist möglich, SQLBulkCopy parallel zu SQL Azure auszuführen, auch wenn Sie die gleiche Tabelle laden. Sie müssen Ihre Datensätze selbst in Stapeln vorbereiten, bevor Sie sie an die SQLBulkCopy-API senden. Dies wird die Leistung auf jeden Fall verbessern und ermöglicht es Ihnen, Wiederholungsoperationen für einen kleineren Stapel von Datensätzen zu steuern, wenn Sie aus Gründen, die Sie nicht selbst zu verantworten haben, gebremst werden.

Werfen Sie einen Blick auf meine Blogbeitrag Vergleich der Ladezeiten der verschiedenen Ansätze. Es gibt auch einen Beispielcode. In separaten Tests konnte ich die Ladezeit einer Tabelle um die Hälfte reduzieren.

Diese Technik verwende ich für einige Tools (Enzo Backup; Enzo Data Copy). Es ist nicht einfach, aber wenn man es richtig macht, kann man die Ladezeiten erheblich optimieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X