PDA

Vollständige Version anzeigen : Langsame DB durch ODBC?


ceki
08.01.2002, 08:35
Hallo Zusammen,

ich hab mir vor einiger Zeit eine DB gebastelt, mit der wir Zutritte dokumentieren können.

D.h. alle Benutzer haben über eine Frontend/Backend-DB ein Endlosformular, in dem alle Standorte aufgelistet sind, wo gerade Techniker vorort sind.

Damit alle Mitarbeiter immer aktuell sind, lasse ich dieses Endlosformular alle 5sek. aktualisieren.

Nun wollten wir einen Schritt weiter gehen und die Backend-Tabellen in eine MySQL-Datenbank auslagern, damit die Daten auch von anderen Anwendungen verwendet werden können.

Seit wir aber die Tabellen nicht mehr lokal in unserem Backend liegen haben, dauert der Refresh des Endlosformulares irre lange. (vorher ca. 0,5 sek. - jetzt 3-4sek.)

Folgenden Tip hab ich hier schon gefunden und probiert, brachte aber keine Änderung:


Option Compare Database
Option Explicit
Private Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long


Private Sub Form_Timer()
LockWindowUpdate Me.hwnd
Me.Requery
Forms![Zutritts-Ticker].Form.Requery
LockWindowUpdate 0&
End Sub

Wenn sich mit der Geschwindigkeit nichts machen läßt, ist die ODBC-Sache wohl oder übel gestorben, weil ich nicht von meinen Kollegen gelyncht werden möchte. *fg*

Hoffe, es hat jemand eine Idee ...

Gruß
Karl <img src="graemlins/idee.gif" border="0" alt="[Idee]" />

ceki
08.01.2002, 08:40
... und das wichtigste wieder mal vergessen:

Windows NT / Access97

Warum merk ich mir das NIE? *ggg*

Karl

Sascha Trowitzsch
08.01.2002, 11:46
Hi ceki,

das mit dem LockWindowUpdate ist ganz sicher unnötig. Das hat ja nur mit dem Neuzeichnen des Fensters zu tun und nicht mit der Datenanbindung.

Bei korrekter Verbindung zu MySQL sollte es nicht langsamer, sondern schneller gehen.

Aber du hast keinerlei Angaben gemacht, wie du die Verbindung herstellst (MyODBC?) und ob du den Code vom Formular noch der Portierung verändert hast.

Ohne zu wissen, was im Formular ablauft und ob es auf einer Abfrage oder eingebundener Tabelle basiert, kann man nicht viel dazu sagen.
Grundsätzlich würde ich raten, das Formular auf Passthrough-Abfragen aufzubauen. Dann sollten eigentlich aus den 0,5 sec 0,05 sec werden ;)
(Unterformulare können übrigens bei SQL-ODBC meist nicht automatisch verknüpft werden. Das muss dann per Code und Parameterabfrage geschehen.)

Ciao, Sascha

ceki
08.01.2002, 14:41
Hi Sascha,

also die Anbindung erfolgt über MyODBC 2.50.39-nt.
Codemäßig hab ich nichts verändert.

Aufgebaut ist die DB wie folgt.

Ein Frontend in dem das Endlosformular liegt, das mir alle Zutritte anzeigt sowie das Eingabeformular, um Zutritte einzugeben. Die drei Tabellen (siehe unten) liegen/lagen im Backend.

Ich hab eine Tabelle "Zutritte" in die die Zutritte wie folgt geschrieben werden.
'Standortnummer' (Text)
'Technikernummer' (Zahl)
'Tätigkeit' (Text)
'kommt' (Datum/Uhrzeit)
'angelegtvon' (Text)
'geht' (Datum/Uhrzeit)
'abgemeldetvon' (Text)

Dann hab ich noch eine Tabelle (Standorte) mit den Standortnummern und den dazugehörigen Adressen, sowie eine Tabelle (Techniker) mit den Technikern (Nr., Vorname, Name, Telefonnummer).

Im Formular, das mir alle aktuellen Zutritte als Endlosformular anzeigt, habe ich über SQL dann diese drei Tabellen verknüpft, damit ich die entsprechenden Adressen, Vornamen und Telefonnummern bekomm.
Dieses Formular laß ich alle 5 sek. aktualisieren, für den Fall, daß ein Mitarbeiter einen Techniker bei einem Standort "anmeldet", daß ALLE anderen Mitarbeiter immer den derzeit aktuellen Stand sehen.
Tickermäßig eben.

Das Einzige, das jetzt verändert wurde, sind die Tabellen (also das Backend)
Die sind jetzt ODBC-Verknüpfungen.
Die Felder wurden aber 1:1 übernommen, außer daß die beiden Datumsfelder jetzt Textfelder sind. Irgendwie hats Troubles gegeben mit einem zweiten Datumsfeld.

Ich hoffe, das waren die Infos, die Du brauchtest.

Gruß und Danke für Deine Mühe
Karl <img src="graemlins/idee.gif" border="0" alt="[Idee]" />

Sascha Trowitzsch
08.01.2002, 16:16
Dann erstell doch mal eine Pass-Trough-Abfrage der Form:

SELECT Techniker.*, Zutritte.*
FROM Techniker INNER JOIN Zutritte ON Techniker.Nr = Zutritte.Technikernummer

und lass darauf das Form basieren.

Teste die Abfrage alleine, um zu sehen, wie schnell sie ist.

Es sollte natürlich Indizes für Techniker.Nr und Zutritte.Technikernummer geben!
Wenn nicht, so müssen die noch angelegt werden.

(Das passiert nicht automatisch, wenn die Daten einfach nur über ODBC in MySQL gespeichert wurden. Drum würde ich dafür ein Tool wie Access2MySQL nehmen, das das automatisch erledigt.)

HTH, ciao, Sascha

ceki
09.01.2002, 08:42
Super, danke Sascha!
Die Pass-Trough ist ein Hammer!
Jetzt läuft der "Ticker" sogar schneller als die lokale Version. Man merkt kaum, daß aktualisiert wird.

Auf Dich ist halt Verlaß!

Ciao
Karl
<img src="graemlins/top.gif" border="0" alt="[Finger hoch]" />

Sascha Trowitzsch
09.01.2002, 09:39
<img src="graemlins/biggrinlove.gif" border="0" alt="[biggrinlove]" /> <img src="graemlins/biggrinlove.gif" border="0" alt="[biggrinlove]" /> <img src="graemlins/biggrinlove.gif" border="0" alt="[biggrinlove]" />

...Und für die, die hier mitlesen, sei dies ein Beispiel, dass es nicht damit getan ist, nur die Tabellen auf einen SQL-Server zu legen, wenn man eine Access-DB auf Client/Server migriert, sondern dass man noch ein paar Umstellungen bewerkstelligen sollte, wenn man den Performance-Vorteil eines SQL-Severs wirklich ausnutzen will.

Ciao, Sascha