Große Variation der Bulk Insert Zeit


13

Daher habe ich einen einfachen Masseneinfügeprozess, um Daten aus unserer Staging-Tabelle in unseren Datamart zu verschieben.

Der Vorgang ist eine einfache Datenflusstask mit den Standardeinstellungen für "Zeilen pro Stapel" und den Optionen "Tablock" und "Keine Prüfbedingung".

Der Tisch ist ziemlich groß. 587.162.986 mit einer Datengröße von 201 GB und 49 GB Indexspeicher. Der Clustered-Index für die Tabelle lautet.

CREATE CLUSTERED INDEX ImageData ON dbo.ImageData
(
    DOC_ID ASC,
    ACCT_NUM ASC,
    MasterID ASC
)

Und der Primärschlüssel ist:

ALTER TABLE dbo.ImageData 
ADD CONSTRAINT ImageData 
PRIMARY KEY NONCLUSTERED 
(
    ImageID ASC,
    DT_CRTE_DOC ASC
)

Jetzt haben wir ein Problem, bei dem BULK INSERTüber SSIS unglaublich langsam läuft. 1 Stunde, um eine Million Zeilen einzufügen. Die Abfrage, die die Tabelle auffüllt, ist bereits sortiert, und die Ausführung der Abfrage zum Auffüllen dauert weniger als eine Minute.

Wenn der Prozess ausgeführt wird, kann ich sehen, dass die Abfrage auf die BULK-Einfügung wartet, die zwischen 5 und 20 Sekunden dauert und eine Art von Wartezeit anzeigt PAGEIOLATCH_EX. Der Prozess kann nur INSERTungefähr tausend Zeilen gleichzeitig verarbeiten.

Gestern, als ich diesen Prozess in meiner UAT-Umgebung getestet habe, bin ich auf dasselbe Problem gestoßen. Ich habe den Prozess einige Male ausgeführt und versucht, die Hauptursache für diese langsame Einfügung zu ermitteln. Dann fing es plötzlich an, in weniger als 5 Minuten zu rennen. Also habe ich es noch ein paar Mal ausgeführt, alle mit dem gleichen Ergebnis. Auch die Anzahl der Masseneinsätze, die 5 Sekunden oder länger gewartet haben, ging von Hunderten auf etwa 4 zurück.

Jetzt ist das verwirrend, weil es nicht so ist, als ob wir einen großen Rückgang der Aktivität hatten.

CPU während der Dauer ist niedrig.

Zentralprozessor

Die Zeiten, in denen es langsamer ist, scheinen weniger Wartezeiten auf der Festplatte zu sein.

Wartet

Die Festplattenlatenz erhöht sich tatsächlich während des Zeitraums, in dem der Prozess in weniger als 5 Minuten ausgeführt wurde.

Latenz

Und der IO war in Zeiten, in denen dieser Prozess schlecht läuft, viel niedriger.

IO

Ich habe es bereits überprüft und es gab kein Dateiwachstum, da die Dateien nur zu 70% voll sind. Die Protokolldatei hat noch 50% zu tun. Die Datenbank befindet sich im einfachen Wiederherstellungsmodus. DB hat nur eine Dateigruppe, verteilt sich jedoch auf 4 Dateien.

Also, was frage ich mich? A: Warum habe ich so lange auf diese Massenbeilagen gewartet? B: Welche Art von Magie hat dazu geführt, dass es schneller lief?

Randnotiz. Es läuft heute wieder scheiße.

UPDATE ist derzeit partitioniert. Es ist jedoch in einer Methode, die bestenfalls albern ist.

CREATE PARTITION SCHEME [ps_Image] AS PARTITION [pf_Image] 
TO ([FG_Image], [FG_Image], [FG_Image], [FG_Image])

CREATE PARTITION FUNCTION [pf_Image](datetime) AS 
RANGE RIGHT FOR VALUES (
      N'2011-12-01T00:00:00.000'
    , N'2013-04-01T00:00:00.000'
    , N'2013-07-01T00:00:00.000'
);

Dadurch verbleiben im Wesentlichen alle Daten in der 4. Partition. Da es sich jedoch alle um die gleiche Dateigruppe handelt. Die Daten sind derzeit ziemlich gleichmäßig auf diese Dateien verteilt.

UPDATE 2 Dies sind die allgemeinen Wartezeiten, wenn der Prozess schlecht läuft.

Warten Sie 1

Dies ist die Wartezeit in der Zeit, in der ich den Prozess ausführen konnte, läuft gut.

Wait2

Das Speichersubsystem ist ein lokal angeschlossenes RAID, kein SAN. Die Protokolle befinden sich auf einem anderen Laufwerk. RAID-Controller ist PERC H800 mit 1 GB Cache-Größe. (Für UAT) Prod ist ein PERC (810).

Wir verwenden eine einfache Wiederherstellung ohne Backups. Es wird jede Nacht von einer Produktionskopie restauriert.

Wir haben auch IsSorted property = TRUEin SSIS festgelegt, da die Daten bereits sortiert sind.


ASYNC_NETWORK_IOBedeutet, dass SQL Server darauf gewartet hat , Zeilen an einen Client zu senden . Ich nehme an, das zeigt die Aktivität von SSIS, die Zeilen aus der Staging-Tabelle verbraucht.
Max Vernon

PAGEIOLATCH_EXund ASYNC_IO_COMPLETIONzeigen an, dass es eine Weile dauert, bis Daten von der Festplatte in den Speicher gelangen. Dies kann ein Hinweis auf ein Problem mit dem Festplattensubsystem sein oder ein Speicherkonflikt. Wie viel Speicher hat SQL Server zur Verfügung?
Max Vernon

Mit einem Tabellennamen von ImageData haben Sie mich neugierig gemacht - wie lautet die tatsächliche Tabellendefinition? Wenn Sie LOB-Daten abrufen, haben Sie möglicherweise auf die Festplatte gepuffert (dies geht zu BLOBTempStoragePath, das, wenn es nicht definiert ist, das% TEMP% -Verzeichnis des ausführenden Benutzers, auch bekannt als C-Laufwerk)
billinkc

Die Tabellendefinition kann nicht veröffentlicht werden, es handelt sich jedoch um Informationen zu den abgebildeten Dokumenten.
Zane

Ich vermute, dass es sich um ein Parallelverarbeitungsproblem handelt. Ich empfehle Ihnen, Ihren MAXDOP zu optimieren (von 1 bis 4) und zu sehen, wie alles funktioniert. Andererseits würde ich zu Testzwecken lieber einen BCP-Befehl erstellen, um SSIS zu ersetzen und festzustellen, ob es einen Unterschied gibt.
Jyao

Antworten:


1

Ich kann nicht auf die Ursache hinweisen, aber ich glaube, dass die Standardreihen pro Stapel für eine BULK INSERT-Operation "alle" sind. Das Festlegen eines Grenzwerts in Zeilen kann dazu führen, dass die Operation leichter verdaulich wird. Deshalb ist dies eine Option. (Hier und im weiteren Verlauf schaue ich mir die Transact-SQL-Dokumentation "BULK INSERT" an, damit SSIS möglicherweise davon abhängt.)

Dadurch wird der Vorgang in mehrere Stapel von X-Zeilen aufgeteilt, von denen jede als separate Transaktion ausgeführt wird. Wenn ein Fehler auftritt, bleiben die abgeschlossenen Stapel in der Zieltabelle festgeschrieben, und der angehaltene Stapel wird zurückgesetzt. Wenn das für Sie akzeptabel ist, dh Sie können es später erneut ausführen und aufholen, dann versuchen Sie es.

Es ist nicht falsch, eine Partitionsfunktion zu haben, die alle aktuellen Einfügungen in eine Tabellenpartition legt, aber ich sehe nicht, wie nützlich es ist, überhaupt mit Partitionen in derselben Dateigruppe zu partitionieren. Und die Verwendung von datetime ist schlecht und tatsächlich für datetime und 'JJJJ-MM-TT' ohne explizite CONVERT-Formel seit SQL Server 2008 defekt (SQL kann dies fröhlich als JJJJ-TT-MM behandeln: kein Scherz: keine Panik, ändere es einfach auf 'JJJJMMTT', festgesetzt: oder KONVERTIEREN (Datum / Uhrzeit 'JJJJ-MM-TTT00: 00: 00', 126), ich denke es ist). Ich denke jedoch, dass die Verwendung eines Proxy für den Datumswert (Jahr als int oder Jahr + Quartal) zum Partitionieren besser funktioniert.

Möglicherweise handelt es sich um ein Design, das von einer anderen Stelle kopiert oder über mehrere Datamarts hinweg dupliziert wurde. Wenn dies ein echter Datamart ist, ein Speicherauszug aus dem Data Warehouse, der Abteilungsleitern einige Daten zum Spielen bereitstellt, die (von Ihnen) nicht an einen anderen Ort weitergeleitet werden und für Datenbenutzer wahrscheinlich schreibgeschützt sind Daher scheint es mir, dass Sie die Partitionsfunktion entfernen oder ändern könnten, um explizit alle neuen Daten in die vierte Partition zu stellen, egal was passiert, und es würde niemanden interessieren. (Vielleicht solltest du überprüfen, ob es niemanden interessiert.)

Es fühlt sich wie ein Entwurf an, bei dem der Inhalt von Partition 1 zu einem späteren Zeitpunkt gelöscht und eine weitere neue Partition für mehr neue Daten erstellt werden soll, aber es hört sich nicht so an, als ob dies hier geschieht. Zumindest ist es seit 2013 nicht mehr passiert.


0

Ich habe die gleiche sporadische extreme Langsamkeit bei Einsätzen an großen, unterteilten Tischen gelegentlich selbst gesehen. Haben Sie versucht, die Zieltabellen Statistics zu aktualisieren und dann erneut auszuführen? Die extreme Wartezeit kann auf schlechte Statistiken zurückzuführen sein. Wenn zu einem bestimmten Zeitpunkt während des Tests ein Statistik-Update ausgelöst wird, erklärt dies den Geschwindigkeitsanstieg. Nur ein Gedanke und ein leicht zu überprüfender Test.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.