Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi MySQL, 8.000.000 DatenS., Tabelle öffnen => der odbc-treiber (https://www.delphipraxis.net/124239-mysql-8-000-000-datens-tabelle-oeffnen-%3D-der-odbc-treiber.html)

Keflock 17. Nov 2008 12:04

Datenbank: MySQL • Version: 5.1 • Zugriff über: ODBC / ADO

MySQL, 8.000.000 DatenS., Tabelle öffnen => der odbc-trei
 
Hallo zusammen,
wie öffne ich Tabellen, die sehr groß sind? Ich verwende TADOs und MySQL 5.1 ODBC. Mein Programm frag täglich ein Laufwerk ab und wertet die dort abgespeicherten Dateien aus. Es funktioniert so lange die Tabelle klein ist. Jetzt, wo ich ca. 8.000.000 Datensätze in einer Tabelle eingespielt habe, so steigt mein Programm bei öffnen der Connection aus:
Delphi-Quellcode:
 
  ADOTable1.Open;
  DateienverarbeitenClick(sender);
  saveMemo(Memo_Verzeichnis);
  ADOTable1.Close;
Früher hatte ich alle Tabellen (verwende insgesamt 8 Tabellen) beim Programmstart geöffnet, da stieg mein Programm bei ca. 6.000.000 Datensetzen verteilt auf die 8 Tabellen. Also dachte ich mir, dass ich zur bestimmten Zeit nur eine Tabelle geöffnet haben darf/kann. Das tue ich jetzt, aber ab 8.000.000 funktioniert es auch nicht mehr.
Ich habe 2GB RAM und eine Auslagerungdatei von 8192MB. Bei Öffnent der Tabelle steigt die RAM-Nutzung auf 1.4GB, es verbleibt noch ausgelagerter RAM frei, "Physikalischer Speicher (KB) => verfügbar" geht gegen 0, es wird ausgelagert und dann kommt der Abbruch:
"der odbc-treiber unterstützt die angeforderten eigenschaften nicht"
Ich habe bereits den CursorLocation auf clUseServer umgestellt. Das hatte ein wenig gebracht. Ich konnte von ca. 6.000.000 auf 8.000.000 die "Öffnungsgreze" hochsetzen.
Was kann ich den jetzt tun? Es gibt doch Möglichkeit bei MySQL nicht über einen ODBC-Treiber zu gehen? Irgendwie native Treiber, oder?
Danke
Kef

Bernhard Geyer 17. Nov 2008 12:19

Re: MySQL, 8.000.000 DatenS., Tabelle öffnen => der odbc-
 
Zitat:

Zitat von Keflock
Ich habe bereits den CursorLocation auf clUseServer umgestellt.

MySQL unterstütz AFAIK keine Serverseitigen Curser.

Zitat:

Zitat von Keflock
Was kann ich den jetzt tun? Es gibt doch Möglichkeit bei MySQL nicht über einen ODBC-Treiber zu gehen? Irgendwie native Treiber, oder?

Eher die Programmlogik anpassen. Wieso werden Mio. von Datensätzen in einer Ergebnismenge benötigt? Wenns Sie benötigt wären dann wäre maximal ein Forward-Only-Curser benötigt + Kompos von Devart welchen einen Serverseitigen Curser "simulieren".

Keflock 17. Nov 2008 12:55

Re: MySQL, 8.000.000 DatenS., Tabelle öffnen => der odbc-
 
Hallo,

also mit dem Cursor müsste es doch was gebracht haben, denn vorher konnte ich bis 6.000.000 quer über alle Tabelle (Tabelle 1 hatte damals ca. 2.000.000 Einträge) lesen, nachher bis ca. 8.000.000.

Zitat:

Eher die Programmlogik anpassen. Wieso werden Mio. von Datensätzen in einer Ergebnismenge benötigt? Wenns Sie benötigt wären dann wäre maximal ein Forward-Only-Curser benötigt + Kompos von Devart welchen einen Serverseitigen Curser "simulieren".
Kurze Beschreibung:
a) ich holle Dateien vom Laufwerk ab
b) schaue nach bestimmten Keywords
c) speichere die Keywords in der MySQL-DB
d) mit dem Query-Browser mache anschließend Abfragen

Mein Problem ist Punkt c). Um die Keywords abzuspeichern mache ich eine Connection.Open und hier kommmt es zu dem Fehler.

Wie kann ich die Progammlogik anpassen? Auch wenn ich nichts aus Deiten lesen würde, nur einfach die Tabelle über Connect öffnen würde, auch dann bekäme ich den Fehler.

Grüße
Kef

franktron 17. Nov 2008 13:16

Re: MySQL, 8.000.000 DatenS., Tabelle öffnen => der odbc-
 
Wozu machst du eine Open beim einfügen ???

Da reicht doch execute oder ?

shmia 17. Nov 2008 13:34

Re: MySQL, 8.000.000 DatenS., Tabelle öffnen => der odbc-
 
Um neue Daten einzufügen, brauchst du doch die bestehenden Daten nicht abzurufen!
Delphi-Quellcode:
Query1.SQL.Text := 'SELECT * FROM Tabelle WHERE 0=1'; // WHERE 0=1 verhindert, dass bestehende Daten abgerufen weerden
Query1.Open;

// ... Schleife über alle einzufügenden Daten
  Query1.Append;
  Query1['Feld1'] := ...
  Query1['Feld2'] := ...
  Query1.Post;
Man kann Datensätze auch mit INSERT einfügen; das ist noch ein bisschen schneller als obige Lösung.
Allerdings ist obige Lösung für den Programmierer bequemer.

Keflock 17. Nov 2008 13:43

Re: MySQL, 8.000.000 DatenS., Tabelle öffnen => der odbc-
 
Hi,

ich verwende TADOConnection und TADOTable.

Bei TADOTable habe ich kein Execute, nur Open.

Was jetzt?

shmia 17. Nov 2008 13:49

Re: MySQL, 8.000.000 DatenS., Tabelle öffnen => der odbc-
 
Zitat:

Zitat von Keflock
ich verwende TADOConnection und TADOTable.
Bei TADOTable habe ich kein Execute, nur Open.

Du ersetzt die TADOTable durch eine TADOQuery-Komponente.
Statt direkt das Property TableName zu setzen, setzt du jetzt das Property SQL auf den Inhalt:
SQL-Code:
SELECT * FROM Tabelle WHERE 0=1
Das Wort "Tabelle" ersetzt du durch den aktuellen Tabellennamen; is klar.
Alles andere bleibt wie es ist.

franktron 17. Nov 2008 13:50

Re: MySQL, 8.000.000 DatenS., Tabelle öffnen => der odbc-
 
Fauler Programmierer :wink:

Nimm Insert und eine Query und alles wird gut und wenn doch nicht nimm was vernünftiges zum Connecten auf die MySQL DB

Keflock 17. Nov 2008 14:43

Re: MySQL, 8.000.000 DatenS., Tabelle öffnen => der odbc-
 
und es geht! Danke!

mfg
KEf


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz