Hallo,
ich habe als Quereinsteiger ein großes altes Delphi-Programm übernommen, das über
ADO auf Datenbanken aus je ca. 15 Tabellen zugreift. Ursprünglich war dieses Programm nur für
Access-DBs gedacht, seit einigen Jahren kann es aber auch
SQL Server. Die Tabellenstrukturen sind auf beiden Seiten identisch.
Im Moment habe ich folgende Situation:
• Ein Kunde möchte aus vielen kleinen
Access-DBs einen einzigen großen Datenbestand auf einem
SQL Server zusammenkopieren, der in einem Remote-Netzwerk "steht".
• Das Umkopieren erfolgt in einem historisch gewachsenen Mix aus Delphi/
DB-
API-Zugriffen und
SQL-Befehlen. Das ist ein Legacy-Code, den ich bisher nur unvollständig durchschaue.
Der Showstopper ist nun folgender:
• Durch das Zusammenkopieren haben die Tabellen auf dem
SQL Server inzwischen derart viele Datensätze, dass allein schon das Öffnen mit TAdoTable.Open()
seehr lange dauert und bei einer bestimmten Tabelle sogar mit der Meldung „
Zuwenig Arbeitsspeicher“ abbricht.
• Der PC selbst hat genug Arbeitsspeicher, es wird einfach die Obergrenze von 4 GB für 32-bit-Programme überschritten.
• Ich habe schon versucht, den Cursor der Server-Datenbank von client- auf serverseitig umzustellen (clUseServer). Dieser Modus wird von dem
DB-Provider auch nicht zurückgesetzt, wenn ich das Open() ausführe. Demnach habe ich also eine gültige Kombination aus Cursorlocation und Cursortype gewählt.
• Aber auch mit dem serverseitigen Cursor wird erstmal ca. 15 Minuten lang versucht, die gesamte Tabelle ins
RAM zu laden, und endet ebenfalls in diesem Abbruch wegen zuwenig Arbeitsspeicher.
Jetzt meine Fragen:
• Ich hatte es so verstanden, dass mit einem „serverseitigen Cursor“ das Open() nicht mehr versucht, die ganze Tabelle auf den lokalen PC runterzuladen. Tut es aber
. Mache ich was falsch? Muss ich eventuell noch mehr umstellen? Irgendwas an der Connection? Oder braucht man doch einen dynamischen Cursor, statt "Keyset"?
• Kann man das Open() noch irgendwie beschleunigen?
• Was ist mit dieser neuen Schnittstelle, FireDAC? Macht die das grundlegend anders?
• Eine Umstrukturierung der
DB, kommt m.E. nicht in Frage, da dazu Hunderte von uralten Stellen angefasst werden müssten. Selbst wenn, würde es m.E. nur das
Speicherproblem lösen, aber nicht das
Geschwindigkeitsproblem.
• Gleiches gilt m.E. für eine Umstellung auf 64 bit.
Gruß
Axel