So steigern Sie die Leistung für bulk-INSERTs auf ODBC verknüpfte Tabellen in Access?
Ich habe CSV-und TXT-Dateien zu importieren. Ich bin das importieren der Dateien in Access und dann das einfügen der Datensätze in einer verknüpften Oracle-Tabelle. Jede Datei hat rund 3 Millionen Zeilen, und der Prozess nimmt eine lange Zeit zu vollenden.
Import in Access ist sehr schnell, aber das einfügen in die verknüpfte Oracle-Tabelle nimmt eine extrem lange Zeit.
Hier ist der Prozess, den ich momentan verwende:
DoCmd.TransferText acImportFixed, "BUSSEP2014 Link Specification", "tblTempSmartSSP", strFName, False
db.Execute "INSERT INTO METER_DATA ([MPO_REFERENCE]) SELECT MPO_REFERENCE FROM tblTempSmartSSP;"`
tblTempSmartSSP
ist eine Access-Tabelle und METER_DATA
ist eine verknüpfte Oracle-Tabelle
Ich habe auch versucht direkt zu importieren, um eine verknüpfte Tabelle, und das war auch sehr langsam.
Wie kann ich den Prozess beschleunigen?
- Meter_Data ist eine Tabelle der oracle-Datenbank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese situation ist nicht ungewöhnlich, dass beim Umgang mit bulk-INSERTs auf ODBC verknüpfte Tabellen in Access. Im Falle der folgenden Access-Abfrage
wo [METER_DATA] ist einer ODBC-verknüpften Tabelle und [tblTempSmartSSP] ist eine lokale (native) Access-Tabelle, ODBC etwas begrenzt ist, wie klug es sein kann, denn es muss in der Lage sein, um eine Breite Palette von Ziel-Datenbanken, deren Funktionen stark variieren kann. Leider ist es oft bedeutet, dass trotz der einzelnen Access-SQL-statement, was tatsächlich gesendet wird, um den Remoteserver (verknüpften) Datenbank ist eine separate INSERT (oder gleichwertig) für jede Zeile in der lokalen Tabelle. Verständlicherweise, die nachweisen können, sehr langsam zu sein, wenn die lokale Tabelle enthält eine große Anzahl von Zeilen.
Option 1: Native bulk-Einfügungen in der entfernten Datenbank
Alle Datenbanken haben eine oder mehrere native Mechanismen für das Massenkopieren von Daten: Microsoft SQL-Server "bcp" und
BULK INSERT
, und Oracle hat mit "SQL*Loader". Diese Mechanismen sind optimiert für bulk-Operationen und bieten in der Regel erhebliche Geschwindigkeits-Vorteile. In der Tat, wenn die Daten in Access importiert und "massiert", bevor Sie übertragen werden, um die remote-Datenbank kann es immer noch schneller, sichern Sie die geänderten Daten wieder in eine text-Datei und dann " bulk import in die remote-Datenbank.Option 2: Verwenden Sie eine pass-through-Abfrage in Access
Wenn die bulk-import-Mechanismen nicht durchführbar, dann eine weitere Möglichkeit ist, erstellen Sie eine oder mehrere pass-through-Abfragen in Access, um die Daten hochzuladen, die Verwendung von INSERT-Anweisungen einfügen können mehr als eine Zeile zu einem Zeitpunkt.
Zum Beispiel, wenn der remote-Datenbank wurde SQL Server (2008 oder höher) - dann könnten wir ausführen einer Access-pass-through - (T-SQL) - Abfrage, wie diese
einfügen von drei Zeilen mit einer INSERT-Anweisung.
Laut einer Antwort auf eine andere frühere Frage hier die entsprechende syntax für die Oracle wäre
Getestet habe ich diese Vorgehensweise mit SQL Server (da ich don ' T haben Zugang zu einer Oracle-Datenbank) mit einem nativen [tblTempSmartSSP] Tabelle mit 10.000 Zeilen. Der code ...
... dauerte ungefähr 100 Sekunden ausgeführt in meiner test-Umgebung.
Dagegen der folgende code, der baut multi-row INSERTs wie oben beschrieben (mit dem, was Microsoft ruft ein Tabellenwertkonstruktor) ...
... dauerte zwischen 1 und 2 Sekunden, um den gleichen Ergebnissen.
(T-SQL Tabelle mit dem Wert Konstruktoren beschränkt sich auf das einfügen von 1000 Zeilen in einer Zeit, so dass der obige code ist ein wenig komplizierter, als wäre es anders.)
Tun Sie importieren alle Spalten? Vielleicht möchten Sie zu verlassen, leere Spalten, wenn vorhanden; und auch Spalten, die nicht absolut notwendig für geschäftliche Zwecke
Sorry, ich habe vergessen den code: