AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ADO langsam :-(

Ein Thema von haentschman · begonnen am 18. Mär 2017 · letzter Beitrag vom 21. Mär 2017
Antwort Antwort
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.432 Beiträge
 
Delphi 12 Athens
 
#1

AW: ADO langsam :-(

  Alt 20. Mär 2017, 15:11

Zitat:
dass du die Objekte aus irgendeiner Abstraktionsschicht zur Verfügung gestellt bekommst, auf die du selbst keinen Einfluss hast.
...dort werden fiese Sachen wie der Wechsel des DBMS gemacht. Dort wird die TNxQuery zur TADOQuery. Letzendlich bleibt es aber auch eine ADOQuery. Das einzige was ich nur machen kann, ist auf der TDataSet Ebene. Da komme ich an die CursorLocation der Connection etc. nicht dran...ist aber auch nicht notwendig, weil die Abstraktionsschicht das regeln muß.
Zitat:
Aus dem Embarcadero Artikel: "SQL Server data in a TADOQuery"
...ich bin nicht allein.
Zitat:
Die hier genannte Option musste ich noch nie ändern
...mach doch mal einen Test bei dir mit Zeitvergleichen mit 100000 Objekten in einer Schleife.

Geändert von haentschman (20. Mär 2017 um 15:34 Uhr)
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
669 Beiträge
 
Delphi 12 Athens
 
#2

AW: ADO langsam :-(

  Alt 20. Mär 2017, 16:07
Ich ziehe alles zurück und behaupte das Gegenteil. Weil hier immer vom Server die Rede war, habe ich zuerst nicht weit genug gedacht (außerdem ist ja Montag ), denn eigentlich habe ich auch schon ziemlich lange ein ähnliches Problem mit TADOQuery: wenn ich die Daten direkt vom Server hole, dann läuft, wie beschrieben, alles ganz wunderbar und ich habe die beschriebenen Performanceprobleme tatsächlich nicht. Aber: ich nutze von der ADOQuery die Funktionen LoadFromFile und SaveToFile. Wenn beim Kunden Probleme in den Daten auftreten, dann kann ich die beim Kunden mit SaveToFile in eine Datei schreiben und bei mir mit LoadFromFile wieder so importieren, als kämen sie direkt aus der Datenbank. Total praktisch, um Fehler zu analysieren.

Dabei war es nun so, dass das LoadFromFile bei mir ab einem bestimmten Umfang der Daten unglaublich langsam wurde. Das war immer sehr lästig (aber bisher doch selten genug, sodass ich einfach damit gelebt habe, zumal es ja nur mich beim Analysieren betrifft und nicht die Kunden direkt), aber ich bin dem Problem irgendwann nicht mehr weiter nachgegangen.

Ausgehend von deinem Beitrag und jetzt, wo ich heute Nachmittag doch mal mehr Zeit hatte, habe ich mir den Blog-Eintrag mal näher angeschaut und dachte mir, könnte doch auch für mich passen. Und tatsächlich: ein Aufruf von myQuery.DisbaleControls hat jetzt beim Test mit einem umfangreichen Datensatz die Importzeit von 110 Sekunden auf 20 Sekunden verkürzt. Cool.

Immer schön, wenn man unerwartet Lösungen für Probleme findet, bei denen man eigentlich schon resigniert hat. Danke dir also für den Thread und die Lösung!
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

AW: ADO langsam :-(

  Alt 20. Mär 2017, 16:10
Meine praktische Vorgehensweise, wenn ich in 'ner Schleife While not EoF über 'nen Dataset laufen muss:

Immer vorher DisableControls, egal um was für eine Datenbankkomponente und / oder Datenbank es sich handelt.

Machts (fast) immer deutlich schneller.

Egal ob ADO oder Zeos oder die schöne, alte TTable und per BDE ...

Sofern ein DataSet 'ner DataSource zugewiesen ist, hilft es, wenn's um Geschwindigkeit geht, ab und an auch, wenn man vorher der DataSource den DataSet auf NIL setzt und am Ende DataSet wieder zuweist.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.432 Beiträge
 
Delphi 12 Athens
 
#4

AW: ADO langsam :-(

  Alt 20. Mär 2017, 16:26
Zitat:
beim Test mit einem umfangreichen Datensatz die Importzeit von 110 Sekunden auf 20 Sekunden verkürzt.
... das deckt sich mit anderen Aussagen, das die Zeit sich auf ca. 30% vom Vorwert einpendelt.

Ich sags ja immer wieder: Again what learned...
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: ADO langsam :-(

  Alt 20. Mär 2017, 16:30
Jo darauf muß man erst einmal kommen.

Denn in der D/ Hilfe steht:
Zitat:
Die Methode DisableControls deaktiviert die Aktualisierung der datensensitiven Steuerelemente, die mit der Datenmenge verbunden sind.

Delphi-Syntax:

procedure DisableControls;

C++ Syntax:

void __fastcall DisableControls(void);

Beschreibung

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.

Wenn die Steuerelemente noch nicht deaktiviert sind, hält DisableControls den aktuellen Status der Datenmenge fest, benachrichtigt die verbundenen datensensitiven Steuerelemente und Detaildatenmengen von der Statusänderung und inkrementiert den Deaktivierungszähler der Datenmenge. Andernfalls wird lediglich der Deaktivierungszähler inkrementiert.

Der Deaktivierungszähler wird intern verwendet, um zu bestimmen, ob Daten in den datensensitiven Steuerelementen angezeigt werden sollen. Enthält die Zählervariable einen Wert größer Null, werden die Daten nicht aktualisiert.

Ist die Datenmenge die Hauptmenge einer Haupt/Detail-Beziehung, wird durch den Aufruf von DisableControls auch diese Beziehung deaktiviert. Wenn Sie BlockReadSize anstelle von DisableControls verwenden, wird die Detaildatenmenge beim Durchlaufen der Datenmenge aktualisiert, die datensensitiven Steuerelemente jedoch nicht.

Hinweis: Aufrufe von DisableControls können verschachtelt werden. Dabei muss jedoch für jeden Aufruf von DisableControls ein entsprechender Aufruf von EnableControls stattfinden, da sonst datensensitive Steuerelemente und Detaildatenmengen nicht aktualisiert werden.
Warum also sollte ich Disablecontrols verwenden, wenn ich mit Datensensitiven Komponenten nichts am Hut habe?


Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

AW: ADO langsam :-(

  Alt 20. Mär 2017, 16:41
Warum also sollte ich Disablecontrols verwenden, wenn ich mit Datensensitiven Komponenten nichts am Hut habe?


Gruß
K-H
Naja, ganz einfach:

Es wird permanent nachgeschaut, ob es eventuell was zu aktuallisieren gibt.

Mit DisableControls wird nicht mehr nachgeschaut.

DataSet weiß halt nicht, ob irgendwelche Komponenten dranhängen, deshalb muss das geprüft werden. Jedes Mal.

DisableControls sagt halt: Spar die die Prüfung (und natürlich dann auch alles das, was da noch dranhängt).

Schnellermachen geht auch noch anders:

Vor der Schleife das Programm minimieren, nachher wieder zurück auf vorherigen Zustand.
Minimiert muss nix Neumalen. Neumalen dauert.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.432 Beiträge
 
Delphi 12 Athens
 
#7

AW: ADO langsam :-(

  Alt 20. Mär 2017, 16:55
Zitat:
DisableControls sagt halt: Spar die die Prüfung (und natürlich dann auch alles das, was da noch dranhängt).
...wenn aber die DataSource = nil ist da würde ich erwarten das die Prüfung eingespart wird.

Alles andere müßten wir am Code der ADOQuery analysieren...wer hat Zeit.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#8

AW: ADO langsam :-(

  Alt 20. Mär 2017, 17:04
Alles andere müßten wir am Code der ADOQuery analysieren...wer hat Zeit.
Nein, das Problem kenn' ich von allen Datenbankkomponenten, das ist nicht typisch ADOQuery.

Die ADO-Schnittstelle selbst ist wohl auch nicht die Schnellste. Da summieren sich dann unterschiedliche "Spaßbremsen".
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

AW: ADO langsam :-(

  Alt 20. Mär 2017, 16:25
Wow, ich hab es auch einmal ausprobiert
a) Ausgabe in ein tMemo 70.000 pro Minute
b) Ausgabe in ein tStringgrid 20.000 pro Minute

Nachher:
a) tMemo 250.000 in 50 sec (davon 13 für das Denken der DB)
b) tStringgrid 250.00 65 sec.

Bei einem Verifikationslauf schwankte die Zeit um ca. 5 Sec.

Aber das ist mir jetzt auch egal.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz