Um die Besonderheiten zusammenzufassen: Wir müssen ungefähr 5 Millionen Zeilen in einer Vendor-Datenbank (Oracle) bereitstellen. Bei Stapeln von 500.000 Zeilen mit OracleBulkCopy
(ODP.NET) funktioniert alles einwandfrei. Wenn wir jedoch versuchen, auf 5 Millionen zu skalieren, verlangsamt sich die Leistung, sobald die 1-Millionen-Marke erreicht ist, und wird allmählich langsamer, je mehr Zeilen geladen werden Zeitüberschreitung nach ca. 3 Stunden.
Ich vermute , dass es im Zusammenhang mit einem Primärschlüssel auf dem Tisch, aber ich habe für Informationen über die Oracle - Foren und Stack - Überlaufes wurde Schleppe und eine Menge von dem, was ich bin im Widerspruch zu lesen , die (auch viele Beiträge zu widersprechen scheinen sie ) . Ich hoffe, dass jemand die Aufzeichnungen in Bezug auf einige eng verwandte Fragen zum Prozess klarstellen kann:
OracleBulkCopy
Verwendet die Klasse konventionelles oder direktes Laden? Kann ich das auf die eine oder andere Weise bestätigen?Vorausgesetzt, es wird direkt geladen: Stimmt es, dass Oracle alle Indizes während des Ladevorgangs automatisch auf unbrauchbar setzt und sie anschließend wieder online stellt? Ich habe mehrere Aussagen zu diesem Zweck gelesen, kann dies aber nicht bestätigen.
Wenn # 2 wahr ist, sollte es dann einen Unterschied machen, welche Indizes in der Tabelle vorhanden sind, bevor ich einen Massenkopiervorgang einleite? Wenn ja warum?
Gibt es in Bezug auf # 3 im Allgemeinen einen praktischen Unterschied zwischen dem Massenladen mit einem nicht verwendbaren Index und dem tatsächlichen Löschen des Index vor dem Laden und dem anschließenden erneuten Erstellen des Index?
Wenn # 2 nicht korrekt ist oder wenn ich einige Einschränkungen nicht verstehe, macht es dann einen Unterschied , den Index vor dem Massenladen explizit unbrauchbar zu machen und ihn anschließend explizit neu zu erstellen?
Gibt es etwas anderes als Indexerstellungen, das dazu führen kann, dass ein Massenkopiervorgang mit dem Hinzufügen von immer mehr Datensätzen immer langsamer wird? (Vielleicht etwas mit der Protokollierung zu tun, obwohl ich davon ausgehen würde, dass Massenvorgänge nicht protokolliert werden?)
Wenn es wirklich keine andere Möglichkeit gibt, die Leistung zu verbessern, als zuerst den PK / Index zu löschen, welche Schritte kann ich unternehmen, um sicherzustellen, dass der Index nicht vollständig verschwindet, dh wenn die Verbindung zur Datenbank verloren geht mitten im Prozess?