Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

odbc-Treiber langsam.

51 views
Skip to first unread message

Klaus-Dieter Urban

unread,
Jan 18, 2001, 9:28:59 AM1/18/01
to
Hallo,
ich benutzte für den MySql-Server auf einen Windows 2000 Client den
Odbc-Treiber 2.50.33.00.
Dabei greife ich von einer Access Datei über eine Verknüpfung auf den
MySql-Server zu.
Leider kennt Access den Limit-Befehl nicht und der Top-Befehl wird von MySql
nicht ausgeführt.
Wenn ich also
"select Name1 from Tabelle" eingebe,
kommt die Antwort nach 50 Sekunden, weil die Tabelle 100.000 Datensätze hat.
ein "select Name1 from Tabell Limit 0,30" nimmt Access nicht an.
Wenn ich den Befehl als SQL-Anweisung beim Netadmin eingebe, kommt die
Antwort sehr schnell.
ein "select top 30 Name1 from Tabelle" über Access dauert so lane wie ohne
"top 30".

Was kann ich machen, damit die Abfragen schnell werden ?
Ich benutzte die Abfragen zum Anzeigen in Tabellenform.
Bei großen Tabellen dauert die Anzeige auf der MySql-Datenbank sehr lange.
Ein "select Name1 from Tabelle where Name1 like 'A%' " möchte ich aber nicht
machen.
Wenn die Tabelle klein ist, wird evt. nur ein oder gar kein Datensatz
angezeigt.
Ab Besten wäre es wir in Access. Da kommt ein "select Name1 from Tabelle"
schnell und
ich kann Theoretisch bis zum Ende blättern.

Gibt es ein Odbc-Treiber, der nur einen Teil der Abfrage zurückgibt ?.

Klaus.


Philipp Stiefel

unread,
Jan 18, 2001, 8:08:53 PM1/18/01
to
Ur...@microsystem.de (Klaus-Dieter Urban) schrieb kürzlich:

> ich benutzte für den MySql-Server auf einen Windows 2000 Client den
> Odbc-Treiber 2.50.33.00.
> Dabei greife ich von einer Access Datei über eine Verknüpfung auf den
> MySql-Server zu.
> Leider kennt Access den Limit-Befehl nicht und der Top-Befehl wird von MySql
> nicht ausgeführt.
> Wenn ich also
> "select Name1 from Tabelle" eingebe,

Wozu soll eine solche Abfrage ohne WHERE-Clause gut sein, wenn
du nicht alle Datensätze haben willst?

> kommt die Antwort nach 50 Sekunden, weil die Tabelle 100.000 Datensätze hat.
> ein "select Name1 from Tabell Limit 0,30" nimmt Access nicht an.

Wenn du die Datensätze nicht aktualisieren musst/willst, nimm eine
SQL-Pass-Through-Abfrage. Da kannst du deinen SQL-String direkt an
mySQL schicken und Access muss ihn nicht verstehen können.

> Wenn ich den Befehl als SQL-Anweisung beim Netadmin eingebe, kommt die
> Antwort sehr schnell.
> ein "select top 30 Name1 from Tabelle" über Access dauert so lane wie ohne
> "top 30".

Joo, klar. Access muss erst alle Datensätze abrufen und dann
sortieren, weil TOP nicht von mySQL ausgewertet werden kann.

> Was kann ich machen, damit die Abfragen schnell werden ?

Query only the data you need! - Abfragen formulieren, die nur die
Daten liefern, die du *wirklich* benötigst.

> Ich benutzte die Abfragen zum Anzeigen in Tabellenform.

Kannst du den Benutzer da nicht eine sinvolle Vorauswahl treffen
lassen? 100.000 Datensätze will eh kein Mensch in einer
tabellenartigen Übersicht haben.

> Bei großen Tabellen dauert die Anzeige auf der MySql-Datenbank sehr lange.
> Ein "select Name1 from Tabelle where Name1 like 'A%' " möchte ich aber nicht
> machen.

Warum nicht?

> Wenn die Tabelle klein ist, wird evt. nur ein oder gar kein Datensatz
> angezeigt.

Aber deine Tabelle ist doch nicht klein! Du musst deine Abfragen
schon ein wenig an das jeweilige Datenvolumen anpassen.

> Ab Besten wäre es wir in Access. Da kommt ein "select Name1 from Tabelle"
> schnell und
> ich kann Theoretisch bis zum Ende blättern.

Access verwendet ein ganz anderes Zugriffsverfahren auf die Daten
als jeder beliebige SQL-Server. Das kann nicht automatisch so
funktionieren, wenn du nicht eine dateibasierende Datenbank
verwendest. (Oder selbst eine vergleichbare Funktionalität
programmierst.)

Da bei einem SQL-Server Client und Server oft räumlich voneinander
getrennt sind, muss der Server ausführen was der Client an Befehlen
sendet. Ob diese Befehle sinvoll sind, hängt von dem Entwickler der
Applikation ab.

> Gibt es ein Odbc-Treiber, der nur einen Teil der Abfrage zurückgibt ?.

Hoffentlich nicht! Woher soll den der Treiber wissen, wann du nur
einen Teil der Daten willst und wann alle?

Gruß
Phil

--
Ich beantworte keine technischen Fragen per Email
Richtig zitieren: http://www.afaik.de/usenet/faq/zitieren/
Mein Codekabinett: http://www.codekabinett.com/
de.comp.datenbanken.mysql-FAQ: http://mysql-faq.sourceforge.net

Klaus-Dieter Urban

unread,
Jan 19, 2001, 2:53:24 AM1/19/01
to
Hallo Philipp,
danke für Deine Antwort.

"Philipp Stiefel" <ph...@codekabinett.de> schrieb im Newsbeitrag
news:9487g...@knight.pstiefel.de...


>
> Wozu soll eine solche Abfrage ohne WHERE-Clause gut sein, wenn
> du nicht alle Datensätze haben willst?

1. Wenn ich die Tabelle zur Auswahl anzeige möchte ich alle Datensätze
auswählen können.

>
> Wenn du die Datensätze nicht aktualisieren musst/willst, nimm eine
> SQL-Pass-Through-Abfrage. Da kannst du deinen SQL-String direkt an
> mySQL schicken und Access muss ihn nicht verstehen können.
>

2. Das Programm ist fertig und für Access eingerichtet. Wenn ich aber einen
Sql-Server benutzten
möchte, brauche ich nur die Tabellen verknüpfen.
Bei MS-Sql Server geht das auch prima. Mir ist der MS-SQL Server aber viel
zu mächtig und zu teuer.
Wenn ich per ISDN auf die Datenbank zugreifen will, dauert das unter Access
sehr lange.
Es sei denn ich ändere alle Select - Befehle auf Select top 1000 . Dann
kommen max 1000 Datensätze.
Das ist glaube ich wohl die einfachste Lösung.


> Query only the data you need! - Abfragen formulieren, die nur die
> Daten liefern, die du *wirklich* benötigst.
>
>

3. Bei einer Liste kann es sein, dass nur 10 Datensätzen angezeigt werden
(weil nur 10 Sätze vorhanden sind),
oder 100.000. Das kann bei jeden Kunden anders sein.


> Kannst du den Benutzer da nicht eine sinvolle Vorauswahl treffen
> lassen? 100.000 Datensätze will eh kein Mensch in einer
> tabellenartigen Übersicht haben.
>

4. Das kann er machen, aber wenn die Liste sehr klein ist, benötigt man das
nicht.
Ich müßte dann das Programm ändern, indem ich erst mal die Datensatzanzahl
feststelle
und danach entscheide ob eine Abfrage ohne "where" erlaubt ist


> > Bei großen Tabellen dauert die Anzeige auf der MySql-Datenbank sehr
lange.
> > Ein "select Name1 from Tabelle where Name1 like 'A%' " möchte ich aber
nicht
> > machen.
>
> Warum nicht?

siehe 4.
entweder ich will alle sehen können, oder nur alle Meier .

Klaus.


Wolfgang Kueter

unread,
Jan 19, 2001, 5:41:48 AM1/19/01
to
Klaus-Dieter Urban wrote:

> 1. Wenn ich die Tabelle zur Auswahl anzeige möchte ich alle Datensätze
> auswählen können.

Man zeigt praktisch nie die Tabellen einer Datenbank an, der Benutzer
kriegt ein ausprogrammiertes Frontend mit den entsprechenden
Eingabemasken vor die Nase und fertig.

> 2. Das Programm ist fertig und für Access eingerichtet.

Kaum, wenn es Tabellen anzeigt, ist es nicht "fertig"

Wolfgang
--
shconnect Internet Service
web: http://www.shconnect.de EMail: in...@shconnect.de
Grosse Strasse 17, 24392 Süderbrarup
Telefon: 04641-970556, Telefax: 04641-970557

Klaus-Dieter Urban

unread,
Jan 19, 2001, 7:53:10 AM1/19/01
to
Hallo Wolfgang,
ich gaube, wir sprechen von verschiedenen Dingen.

"Wolfgang Kueter" <wolf...@shconnect.de> schrieb im Newsbeitrag
news:3A6819EC...@shconnect.de...


> Klaus-Dieter Urban wrote:
>
> > 1. Wenn ich die Tabelle zur Auswahl anzeige möchte ich alle Datensätze
> > auswählen können.
>
> Man zeigt praktisch nie die Tabellen einer Datenbank an, der Benutzer
> kriegt ein ausprogrammiertes Frontend mit den entsprechenden
> Eingabemasken vor die Nase und fertig.

Ich meine folgendes:
Im Programm Kundenstamm, Kundenliste anzeigen.
Wenn der Benutzer keine Vorauswahl trifft, dann werden die Kunden in
Reihenfolge Kundennummer oder Matchcode angezeigt. (Je nach Click)
Darin kann man dann blättern. Man kann zB. in die Mitte der Leiste gehen
und alle Kunden die im mittlenren Bereich zu finden sind (bei Matchcode =
M...) werden angezeigt.
Bei Access macht da auch eine 100.000 Datensätze große Tabelle kein Ärger.

So ähnlich ist es auch bei der Auswahl der Rechnungen.
Die Liste zeigt die zu letzt bearbeiteten Belege, aber man hat auch die
Möglichkeit weiter in
älteren Belegen zu blättern.
Natürlich hat man auch die Möglichkeit gezieht zu suchen oder direkt
auszuwählen.

Wenn man das alles per Sql-Abfragen optimieren möchte, ist das ne menge
Arbeit.
Außerdem wird Top 30 nicht in Limit 0,30 umgewandelt.
So müßte ich dann die SQL-Abfrage sehr präzise stellen, und dann ungenauer
werden,
damit mir ca. 30 Datensätze angezeigt werden.
Bei Bild-Tief dann von dem letztes Datensatz weiter suchen und versuchen
wieder nur
30 Datensätze zu erhalten.

Ich suche die Möglichkeit, in deiner Liste zu suchen.
In Access mit top 30 und in MySql mit Limit 0,30 geht das auch.
Da das Programm aber eine Access Datei öffnet, und in dieser Datei dann
MySql-Verknüpfungen
stehen, werden dann alle Felder ermittet, aber nicht übertragen. Denn wenn
ich dann weiter blättere
dauert es bis zur nächsten Anzeige wieder ein wenig.

Gibt es eine Möglichkeit top 30 in Limit 0,30 umzuwandeln ?

>
> > 2. Das Programm ist fertig und für Access eingerichtet.
>
> Kaum, wenn es Tabellen anzeigt, ist es nicht "fertig"

siehe oben.

Klaus.


Wolfgang Kueter

unread,
Jan 19, 2001, 8:56:58 AM1/19/01
to
Klaus-Dieter Urban wrote:

> [...]

> Wenn man das alles per Sql-Abfragen optimieren möchte, ist das ne menge
> Arbeit.

Um diese Arbeit wird man wohl nicht drum rum kommen.

> Außerdem wird Top 30 nicht in Limit 0,30 umgewandelt.

Stichwort: SQL Pass Through, kam schon von Phillip ...

Klaus-Dieter Urban

unread,
Jan 23, 2001, 7:53:13 AM1/23/01
to
Hallo Wolfgang,

"Wolfgang Kueter" <wolf...@shconnect.de> schrieb im Newsbeitrag

news:3A6847AA...@shconnect.de...


> Klaus-Dieter Urban wrote:
>
> > Außerdem wird Top 30 nicht in Limit 0,30 umgewandelt.
>
> Stichwort: SQL Pass Through, kam schon von Phillip ...
>

Sql Pass Through ist doch einge völlig andere Abfrage.
Das fertige Programm greift zuerst auf eine Access Tabelle.
In dieser Tabelle stehen dann die Verknüpfungen zu anderen Tabellen.
Die anderen Tabellen sind jetzt auch Access Tabellen.
Das geht auch sehr schnell, nur über Ras per Isdn ist es zu langsam.
Deshalb wollte ich die verknüpften Tabellen auf einen SQL-Server auslagern,
damit die Isdn-Verbindung schneller wird. Leider ist das nur bei MS-Sql
Server so.
Wenn ich MySql nehme, dauert es noch länger, als wenn ich nur
Access-Tabellen nehmen.
Das liegt daran, weil der Odbc-Treiber aus Top 30 kein Limit 0,30 macht.
Wenn mir eine Abfrage zu viele Ergebnisse liefert, dauert es dadurch sehr
lange.
Ich könnte höchstens den Time-out nidriger setzen und dann nach 3 Sekunden
erfolgloser
Suche die Meldung "Es wurden zu viele Daten gefunden, bitte mehr Eingrenzen
!" anzeigen.

Klaus.


0 new messages