Ich sehe erhebliche Leistungsunterschiede zwischen OracleBulkCopy (ODP.NET) und SQL * Loader, wenn der Oracle-Server auf einem anderen Computer ist.
Ich habe eine sehr einfache Tabelle in Oracle mit drei Spalten (eine BINARY_FLOAT, zwei NUMBER (18,0)). Es gibt keine Primärschlüssel, Indizes, Trigger usw. Es wird als Staging-Tabelle verwendet, um Massendaten in die DB zu bekommen.
SQL * Loader benötigt etwa 27 Sekunden, um 4,5 Millionen Zeilen in die Tabelle zu laden.
OracleBulkCopy benötigt ungefähr 10 Minuten, um nur 1 Million Zeilen zu laden.
OracleBulkCopy, gemäß der Dokumentation, * "... verwendet einen Direct Path Load-Ansatz, der dem Oracle SQL * Loader ähnlich ist, aber nicht mit ihm identisch ist." * Es ist möglicherweise nicht mit SQL * Loader drin Begriffe der Leistung, aber dieser Unterschied ist lächerlich.
Nach einer grundlegenden Analyse des Netzwerkverkehrs habe ich festgestellt, dass die OracleBulkCopy eine große Anzahl kleiner Pakete gesendet und empfangen hat. Ich benutzte Wireshark, um die Pakete für jeden zu vergleichen und einige interessante Ergebnisse zu finden.
SQL * Loader sendet nach dem ersten Verbindungs-Handshake eine Reihe von 8 Kilobyte Paketen (TNS-Protokoll) und empfängt als Antwort 60 Byte ACKs .
OracleBulkCopy sendet eine Reihe von 102 Byte Paketen (TNS-Protokoll) und empfängt als Antwort ein 133 Byte Paket (TNS-Protokoll). Was zum...!? Es ist so, als würde es eine Reihe nach der anderen senden!
Mit der OracleBulkCopy-Klasse verwende ich eine Stapelgröße von 100.000 und verwende einen benutzerdefinierten IDataReader , um aus einer Datendatei zu lesen.
Meine Fragen sind also:
Hat jemals jemand dieses Verhalten gesehen?
Funktioniert OracleBulkCopy tatsächlich als Massenladewerkzeug?
Gibt es etwas, das ich konfigurieren muss, damit es richtig funktioniert? (Client / Server-Einstellungen usw.)
Jede Hilfe wird sehr geschätzt.
Ich habe eine Antwort von Alex Keh, Oracle Product Manager, erhalten, dass Oracle "dieses Problem ebenfalls bemerkt hat. Wir prüfen, wie wir diesen Fehler beheben können."
Ich nehme an, dass OracleBulkCopy in der Antwort auf meine eigenen Fragen nicht gut als Bulk-Loading-Tool funktioniert. Zumindest nicht im Moment.
Ich werde SQL * Loader als alternative Lösung verwenden, da es keine ETA für die Fehlerbehebung gibt.
Tritt dieses Problem auch bei Verwendung einer DataTable als Quelle auf? Oder liegt es nur an der Verwendung eines IDataReader?
Tags und Links .net oracle odp.net sql-loader