Access via ISDN auf MySQL

Hallo zusammen,

ich habe einen MySQL-Server, auf den ich mit Access und ODBC über ISDN zugreife. Das Öffnen von Tabellen geht einigermaßen schnell, jedoch bei Abfragen oder Formularen, die auf Abfragen basieren, dauert es ewig. Ich habe die Abfragen auch schon mittels „Pass-Through“ definiert, dabei dauert es seltsamerweise noch länger.
Das Problem ist, dass bei einer einfachen Abfrage, auch wenn sie nur 1-2 Datensätze zurückgibt, mehrere MB Daten übertragen werden. Klar also, dass das über ISDN ewig dauert.
Wo liegt das Problem? Wie kann ich Access und MySQL zum ordentlichen Zusammenarbeiten bringen?

Danke, Philip

Hallo zusammen,

ich habe einen MySQL-Server, auf den ich mit Access und ODBC
über ISDN zugreife. Das Öffnen von Tabellen geht einigermaßen
schnell, jedoch bei Abfragen oder Formularen, die auf Abfragen
basieren, dauert es ewig. Ich habe die Abfragen auch schon
mittels „Pass-Through“ definiert, dabei dauert es
seltsamerweise noch länger.
Das Problem ist, dass bei einer einfachen Abfrage, auch wenn
sie nur 1-2 Datensätze zurückgibt, mehrere MB Daten übertragen
werden. Klar also, dass das über ISDN ewig dauert.
Wo liegt das Problem? Wie kann ich Access und MySQL zum
ordentlichen Zusammenarbeiten bringen?

Wenn ich dich richtig verstanden habe, verwendest du Access für die Formulare,
die Tabellen zur MySQL Datenbank sind über über ODBC verknüpft. In den Formularen arbeitest du mit den Verknüpften Tabellen und greifst so remote auf den Server zu.

Ohne mich jetzt großartig mit MySQL auszukennen, ist das Problem vermutlich, das die Abfragen lokal ausgeführt werden. Involvierst du in einer Query also mehrere Tabellen, so werden diese jedes mal (komplett!?) übertragen. Das dauert und ist aufwendig.
Wenn es in MySql so etwas wie Views gibt, solltest du die Abfragen in Form einen Views auf den MySQL Server bringen und diesen View als Tabelle in deine Access Datenbank verknüpfen. So sparst du dir das ständige Kopieren.

Gruß Markus

P.S. Wenn mein Tipp funktioniert, gib mir bitte Rückmeldung. Mich interssiert das auch.

Du sollstes möglichst nicht mit gebundenen Formularen arbeiten - und wenn doch, diese so filtern, dass nur jeweils ein Datensatz angezeigt wird.

Die Filterung sollte eigentlich der ODBC-Treiber erledigen - bei unglücklichen Konstruktionen (z.B.: Filterung über VBA-Ausdrücken bzw. -Funktionen, falsch konstruierten Joins usw.) wird allerdings trotzdem die gesamte Tabelle geladen.

Gruß aus dem Norden
Reinhard Kraasch

(http://www.dbwiki.de - das Datenbank-Wiki)

Ein Beispiel zur Verdeutlichung:

Ich habe eine Tabelle (Auszug)
Kundennr, Name, Vorname, Adresse, PLZ, Ort
Die Tabelle liegt auf dem MySQL-Server und enthält ca 6000 Datensätze.

Öffne ich nun aus Access heraus einfach nur die Tabelle, dann dauert das 5-6 Sekunden, und sie ist da. Soweit alles ok.

Wenn ich nun eine Acess-Abrage laufen lasse, die alle Daten anzeigt mit PLZ > 50000, dann dauert das etwa 5 Minuten. Auch wenn ich die Abfrage in Access als Pass-Through definiert habe.
Es werden ca 5-6 MB Daten übertragen.
Der MySQL-Server langweilt sich derweil. Und auch die Auslastung lokal ändert sich nicht. Das Problem liegt also einzig und allein an der übertragenen Menge von Daten, die bei einer Abfrage ungleich höher ist, als wenn ich nur die Tabelle öffne. Und das, obwohl in der Tabelle etwa das doppelte an Daten steht, als die Abfrage hervorbringt.

Was sind denn das für Daten, die Access da überträgt? Ich könnte mir zwei Dinge vorstellen:

  1. Access fordert die komplette Tabelle an (dauert 5-6 Sekunden), führt dann die Abfrage lokal aus und zeigt das Ergebnis an.
  2. Access schickt das SQL-Statement an MySQL, der Server führt die Abfrage aus und schickt das Ergebnis zurück (sollte ja nicht länger dauern, als die komplette Tabelle zu übertragen…) So funktioniert das ja offensichtlich bei „Pass-Through“

Beides scheint aber nicht zuzutreffen, denn sonst wäre ja kein Geschwindigkeitsunterschied zu verzeichen zwischen dem Öffnen einer Tabelle und dem Öffnen einer Abfrage.

Weitere Möglichkeit: Access fordert die komplette Tabelle an, prüft, ob das SQL-Statement auf die erste Zeile zutrifft, fordert wieder die komplette Tabelle an, prüft die zweite Zeile, usw…

Woher kommt also der ganze Traffic über ISDN?

Danke für weitere Hinweise,

Philip.

Was meinst du mit „nur die Tabelle öffnen“? Die Tabelle als Datenblatt darstellen? Dabei werden nur die ersten paar Datensätze geholt, die zur Darstellung erforderlich sind - die restlichen werden bei Bedarf nachgeholt. (Klick mal auf die Schaltfläche, die dich ans Ende der Tabelle bringt - das wird dann auch 5 Minuten dauern!)

Wenn du die Abfrage unglücklich formulierst (z.B. das PLZ-Feld als Textfeld definiert ist und mit einer Zahl verglichen wird) oder auch z.B. das Postleitzahlenfeld nicht indiziert ist, müssen für den Vergleich PLZ > 50000 alle Datensätze geholt werden.

Wichtig ist (unter anderem):

  • die Verwendung von Indizes
  • die Verwendung von vom Typ her passenden Vergleichsausdrücken
  • Vermeiden von Konstruktionen wie LIKE ‚%xxx%‘
  • Keine VBA-Funktionen in Vergleichsausdrücken
  • Joins müssen geeignet aufgebaut sein (besser: Joins in Form von serverseitigen Views erstellen).

Gruß aus dem Norden
Reinhard Kraasch

(http://www.dbwiki.de - das Datenbank-Wiki)

Hallo Reinhard,

Was meinst du mit „nur die Tabelle öffnen“? Die Tabelle als
Datenblatt darstellen? Dabei werden nur die ersten paar
Datensätze geholt, die zur Darstellung erforderlich sind - die
restlichen werden bei Bedarf nachgeholt. (Klick mal auf die
Schaltfläche, die dich ans Ende der Tabelle bringt - das wird
dann auch 5 Minuten dauern!)

Nee, eben nicht. Der Sprung zum letzen von 6000 Datensätzen dauert so 1-2 Sekunden…

Wichtig ist (unter anderem):

  • die Verwendung von Indizes

Sind indiziert…

  • die Verwendung von vom Typ her passenden
    Vergleichsausdrücken

Hab ich…

  • Vermeiden von Konstruktionen wie LIKE ‚%xxx%‘

Gibt es nicht…

  • Keine VBA-Funktionen in Vergleichsausdrücken

Auch nicht…

  • Joins müssen geeignet aufgebaut sein (besser: Joins in Form
    von serverseitigen Views erstellen).

Naja, Views kann MySQl leider nicht. Aber bislang sind die Abfragen ja komplett ohne Joins, trotzdem langsam…

Naja, dennoch erstmal vielen Dank für die Hilfe,

Grüße, Philip