Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Access CommandText zuweisen dauert 10 Sekunden (https://www.delphipraxis.net/140809-access-commandtext-zuweisen-dauert-10-sekunden.html)

Perlsau 26. Sep 2009 11:16

Datenbank: MS-Access • Version: 2003 • Zugriff über: Ado; Treiber: MS-Jet OLEDB 4.0

Access CommandText zuweisen dauert 10 Sekunden
 
Eine Frage an alle, die mit Delphi auf eine Access-Datenbank zugreifen:

Gegeben ist eine Adress-Datenbank mit 16 Feldern und 10.000 Einträgen. Beim Suchen werden relevante Datensätze selektiert, in der Tabelle (DBgrid) werden auch nur die selektierten Datensätze angezeigt und zusätzlich eine CheckBox "nur Suchergebnisse anzeigen" gechecked. Besser gesagt: Erst in der Ereignisbehandlung "OnClick" dieser Checkbox weise ich den CommandText der AdoDataSet-Komponente zu:
Delphi-Quellcode:
DatMod.Aset_Adress.Active := FALSE;
IF  Check_Suchanzeige.Checked
THEN DatMod.Aset_Adress.CommandText := SuchFilter
ELSE DatMod.Aset_Adress.CommandText := DefaultFilter;
DatMod.Aset_Adress.Active := TRUE;
Das funktioniert alles bestens, die Resultate sind einwandfrei, keine Fehlermeldungen wegen falscher SQL-Statements usw. Doch das Rücksetzen (DefaultFilter), das mit dem Entfernen des Hakens in der CheckBox ausgelöst wird, dauert gute 10 Sekunden (bei einem Intel Double-Core-Rechner mit insges. 7 GHz). SuchFilter und DefaultFilter sind Widestrings, die den CommandText enthalten. Erstgenannte Variable enthält den CommandText für die Selektion (Select Adress.Name, Adress.Vorname usw. FROM ... WHERE ...) und DefaultFilter einfach nur "Select * FROM Adress".

Mich interessiert nun, ob diese unerträglich lange Zeit von 10 Sekunden, die benötigt wird, um wieder alle Einträge anzuzeigen, an MS-Access liegt oder ob ich etwas falsch/umständlich mache und das beschleunigen könnte.

Ich danke schon mal im Voraus für eure wertvollen Hinweise.

DeddyH 26. Sep 2009 11:20

Re: Access CommandText zuweisen dauert 10 Sekunden
 
Hallo und Willkommen in der DP :dp:,

DisableControls und EnableControls hast Du benutzt? Ich könnte mir vorstellen, dass die Neuzeichnerei der datensensitiven Komponenten der Flaschenhals ist.

Perlsau 26. Sep 2009 11:41

Re: Access CommandText zuweisen dauert 10 Sekunden
 
Zitat:

Zitat von DeddyH
Hallo und Willkommen in der DP :dp:,

Herzlichen Dank. Bin hier zwar schon länger angemeldet, hab aber ausser einer Gesuch noch nichts geschrieben.

Zitat:

Zitat von DeddyH
DisableControls und EnableControls hast Du benutzt? Ich könnte mir vorstellen, dass die Neuzeichnerei der datensensitiven Komponenten der Flaschenhals ist.

Meinst du damit, ich soll die Eigenschaft Enabled des DBgrid und der DB-Editfelder vor dem Zuweisen von CommandText auf FALSE setzen und nach dem .Active := TRUE wieder auf TRUE? Wenn ja, das hab ich eben ausprobiert, ohne daß die Sache schneller wurde.

DeddyH 26. Sep 2009 11:47

Re: Access CommandText zuweisen dauert 10 Sekunden
 
Ich meinte die DisableControls-Methode von TDataset.
Zitat:

Zitat von Delphi-Hilfe
Rufen Sie DisableControls vor dem Verarbeiten einer großen Anzahl von Datensätzen auf, damit die datensensitiven Steuerelemente nicht bei jeder Änderung des aktiven Datensatzes aktualisiert werden. Auf diese Weise kann die ständige Bildschirmaktualisierung verhindert und die Verarbeitung beschleunigt werden, da die Daten nicht laufend auf dem Bildschirm ausgegeben werden müssen.


Perlsau 26. Sep 2009 11:52

Re: Access CommandText zuweisen dauert 10 Sekunden
 
Zitat:

Zitat von DeddyH
Ich meinte die DisableControls-Methode von TDataset.

Oh, sorry, das hab ich mißverstanden. Doch auch das beschleunigt den Vorgang nicht: ich kann dabei locker bis 10 zählen ...
AHH, jetzt ist mir noch was aufgefallen: vor dem EnableControls stand bei mir noch ein Refresh. Nachdem ich das rausgelöscht habe, dauert der Vorgang nur noch ca. 2 Sekunden. Das ist akzeptabel.

Ich danke dir für deine schnelle und punktgenaue Hilfe. Ohne diese hätte ich wohl stundenlang gesucht ;-)

DeddyH 26. Sep 2009 11:57

Re: Access CommandText zuweisen dauert 10 Sekunden
 
Kein Problem, dazu ist ein Forum ja da ;)

Perlsau 26. Sep 2009 13:59

Re: Access CommandText zuweisen dauert 10 Sekunden
 
Zitat:

Zitat von DeddyH
Kein Problem, dazu ist ein Forum ja da ;)

Genau, ich fühl mich jetzt auch wie im 7. Programiererhimmel ;-)

Eine Frage hab ich aber noch: Wie stelle ich es an, den Thread hier als beantwortet zu markieren? Oder muß ich das nur, wenn ich zuvor den Haken "Als offene Frage markieren" gesetzt habe?

DeddyH 26. Sep 2009 15:28

Re: Access CommandText zuweisen dauert 10 Sekunden
 
Zitat:

Zitat von Perlsau
Oder muß ich das nur, wenn ich zuvor den Haken "Als offene Frage markieren" gesetzt habe?

So ist es.

Bernhard Geyer 26. Sep 2009 17:11

Re: Access CommandText zuweisen dauert 10 Sekunden
 
Zitat:

Zitat von Perlsau
(bei einem Intel Double-Core-Rechner mit insges. 7 GHz)

Vergiss die GHz. Bei der verwendung einer Desktop-DB ist oft die HD bzw. die RAM-Geschwindigkeit primär für die Geschwindigkeit verantwortlich. Und Access glaube ich kann auch nicht mit mehr als einem Kern anfangen.

Arbeitest du auch mit CurserLocation clUseServer? Kann bei Access auch einiges wegen vermeiden einer unnötigen Datenkopier-Aktion bringen.

Perlsau 26. Sep 2009 17:36

Re: Access CommandText zuweisen dauert 10 Sekunden
 
Zitat:

Zitat von Bernhard Geyer
Vergiss die GHz. Bei der verwendung einer Desktop-DB ist oft die HD bzw. die RAM-Geschwindigkeit primär für die Geschwindigkeit verantwortlich. Und Access glaube ich kann auch nicht mit mehr als einem Kern anfangen.

Das wußte ich nicht. Ich hatte beim letzten Kunden, der eines meiner Delphi-Programme mit Access-Datenbank auf einem 800-Mhz-Rechner fährt, keinen erkennbaren Geschwindigkeitsunterschied bemerken können.

Zitat:

Zitat von Bernhard Geyer
Arbeitest du auch mit CurserLocation clUseServer? Kann bei Access auch einiges wegen vermeiden einer unnötigen Datenkopier-Aktion bringen.

Hab eben mal umgestellt auf clUseServer, doch ohne erkennbaren Unterschied, wenn ich die Where-Bedingung wieder aufhebe und alle Datensätze anzeigen lasse. Ich muß das mal genauer testen mit eingebauten Timer, ob sich bei verschiedenen Operationen, die ich benötige, ein Gewschwindigkeitsvorteil ergibt.

Wenn ich die Eigenschaft CursorLocation richtig verstanden habe, arbeitet mein Programm bei clUseClient mit einer Kopie, die auf der Platte liegt? Und bei clUseServer mit der Original-Datei (z.B. Adressen.mdb)?

In meiner Online-Hilfe steht, daß sich der Wert nur auf Verbindungen auswirkt, die nach der Zuweisung geöffnet werden. Und daß man clUseServer verwenden muß, wenn der Plattenplatz beim Client nicht ausreichen würde, alle selektieren Datensätze zwischen zu speichern. Platz hab ich aber genug, daher dürfte es wohl egal sein, welche Einstellung ich beim Property CursorLocation verwende. Die Datenbank liegt zudem im selben Ordner wie die Anwendung, also nicht auf irgend einem Server.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:29 Uhr.
Seite 1 von 2  1 2      

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