AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Firedac Query fetch all

Ein Thema von MES · begonnen am 9. Okt 2017 · letzter Beitrag vom 13. Okt 2017
Antwort Antwort
Seite 1 von 2  1 2   
MES

Registriert seit: 23. Dez 2008
Ort: PLZ 73
39 Beiträge
 
#1

Firedac Query fetch all

  Alt 9. Okt 2017, 10:48
Datenbank: MariaDB • Version: 10.1.13 • Zugriff über: Firedac
Hallo miteinander.
Ich hab da ein Problem das uns seit Tagen beschäftigt: Das Öffnen einer Query fürt bei einer bereits geöffneten Query zu einem "Fetch all" auf der vorher schon geöffnet Query.

Beispiel:

query1.open('select * from xx' ); RowSetSize=50; Ergebnis: 50 Datensätze -> ok

query2.open('select * from yy' ); Fetch All; Ergebnis query2k ABER Query1 hat nun nicht mehr 50 Datensätze sondern ALLE Datensätze (z.B. 100.000)

Gemeinsamkeiten:
1) Querys sind in Datamodule - aber in unterschiedliche
2) Benutzen die gleiche Connection
3) InnoDB
4) Beide Querys haben Indizierte Felder (Indexname)

Es gibt keinerlei Verbindungen/Relations zw. den Querys

Und noch was: Bei manchen Querys gibt es nicht dieses Verhalten, bei anderen jedoch immer.

Hat jemand eine Idee wie ich das umgehen kann oder was ich falsch mache?
LG

MES
  Mit Zitat antworten Zitat
MES

Registriert seit: 23. Dez 2008
Ort: PLZ 73
39 Beiträge
 
#2

AW: Firedac Query fetch all

  Alt 9. Okt 2017, 12:09
Es scheint als kämen wir der Ursache näher: wenn beide Query auf die gleiche Art (z.B. Conection) dann tritt der Fall auf. Wird eine über Conection und die Andere über Connactionname angesprochen ist es so wie es sein soll(kein Fetch All auf Query1)
LG

MES
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#3

AW: Firedac Query fetch all

  Alt 9. Okt 2017, 12:20
Ich kenne die Firedac Kompos nicht, aber es ist wohl eher so, dass fetchall auf eine gesamte Connection angewendet wird. Wenn Du nun mit Connection Alternativen rumwuselst, läuft es wahrscheinlich darauf hinaus, dass 2 separate Connections verwendet werden.
Das funktioniert also dann auf die Art eher nicht für beliebig viele Queries.
Man müsste gezielt neue Connections erzeugen oder noch viel besser:
Die Datenmengen sofort so filtern, dass nur die gewünschte Menge angezeigt wird bzw. mit Where Clause in den Queries arbeiten.
Gruß, Jo
  Mit Zitat antworten Zitat
MES

Registriert seit: 23. Dez 2008
Ort: PLZ 73
39 Beiträge
 
#4

AW: Firedac Query fetch all

  Alt 9. Okt 2017, 12:45
Danke für die Rückmeldung, ich befürchte es könnte sich bewahrheiten was Du schreibst. Dann kick ich das Ganze in den Papierkorb und setze wieder Table statt Query ein.

Nehmen wir an, Query1 wäre ein Artikelstamm in dem oft gescrollt wird etc. und das Query2 Zahlungsbedingungen sind.
Wie soll ich den Artikelstamm eingrenzen, nach welchen Kriterien? Und warum? Nur weil ich eine zweite Query mit 20 Datensätze aufmache? Das Fetchen der Daten mit Rowsetsize=50 geht recht fix aber in meinem Beispiel hat der Artikelstamm z.B. 100.000 Datensätze (kann auch eine Million oder mehr haben). Das eigenmächtige Einlesen dieser Datensätze nur weil ich eine 2. Query öffne dauert nicht nur lange (6-7 Sekunden) sondern ist auch unnötig - aus meiner einfachen Sicht als BDE-Umsteiger (von TTable).

Ich vermute eher das es sich um einen Bug handelt. Frage: Ist dieses Verhalten unter anderen Datenbanken auch so?
LG

MES
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#5

AW: Firedac Query fetch all

  Alt 9. Okt 2017, 13:59
Ich hatte diese FetchAll Geschichte eher für ein älteres Problem gehalten.
Wie auch immer, ich arbeite immer mit Where Clause und ich denke, das ist nicht unüblich. FetchAll sind für mich begrifflich sehr nahe an cursor Implementierungen,die sehr spezifisch (Herteller) sein können.
Jede Komponente macht es auch etwas anders, bei Ado sind es maxrecords oder so einfach als Attribut des Dataset.
Denen "goldenen" Weg bei Diredac kenne ich nicht.

Wenn Du Table "gewohnt" bist, musst Du Dich wohl an Query und Where Clause gewöhnen oder solltest zumindest. Das Öffnen einer großen Datenmenge auf dem Server erzeugt auch eine erhebliche Last, ohne dass alle Sätze übertragen werden. Das will man nicht, insbesondere nicht in Mehrbenutzerumgebungen. Sehr leicht verständlich, wenn man sich Umgebungen wie Facebook o.ä. anschaut. Da wird natürlich nicht eine ganze User Table geöffnet nur weil sich einer anmeldet.
Gruß, Jo
  Mit Zitat antworten Zitat
MES

Registriert seit: 23. Dez 2008
Ort: PLZ 73
39 Beiträge
 
#6

AW: Firedac Query fetch all

  Alt 9. Okt 2017, 16:38
Hast ja recht. Deswegen grenze es ja ein:
query1.open('Select * from Artikelstam where Artikeltyp='P') -> ergibt eine Datenmenge von sagen wir mal größer 50. Durch die Rowsetsize werden die ersten 50 geladen.

Nun kommt eine 2 Query die ich öffnen will. Die hat so wenige Datensätze, dass sich eine "where" nicht lohnt (kleiner 50).

query2.open('Select * from Zahlungsbedingungen' ). Jetzt wird bei der Query1 die Rowsetsize automatisch verworfen und es werden alle Datensätze eingelesen.
Selbst wenn ich in der query2 auch ein "where" einbaue (über Parameter) bleibt das Ergebnis unverändert. Zum besseren Verständnis ein weiteres Beispiel: query2 sind Lagerorte auf denen dieser Artikel gelagert ist. Im oberen Grid navigiert man über die Artikel und im unteren Grid werden die Lagerorte angezeigt. Quasi Master/Detail. Kann man sich leich mit Rechungen/Positione etc. auch vorstellen.

Doch ob ich wie oben beschrieben oder die Querys wahllos zum Testen öffne - es erfolgt immer ein "Aushebeln" der Rowsetsize und ein fetch all der query1 ist die Folge. Selbst wenn die Querys in keinerlei Beziehungen zueinander stehen. Es sieht aus, als ob beim Öffnen der 2. Query ein "disconnect" stattfindet um die 2. Query zu connecten und bei dem erneuten Connect der 1. Querry ein fetch all stattfindet. IRRE.
LG

MES
  Mit Zitat antworten Zitat
MES

Registriert seit: 23. Dez 2008
Ort: PLZ 73
39 Beiträge
 
#7

AW: Firedac Query fetch all

  Alt 9. Okt 2017, 17:11
Tagesabschlussmeldung: Es scheint am Verbindungsmanager zu liegen. Diesen verwenden wir um aus einer Ini die Werte raus zu lesen(Typ Persistent).
Stellen wir die Connection ohne den Manger her(in der Entwickungsumgebung) ist alles ok. Es funktioniert auch sauber (also kein fetch all) wenn wir die Verbindung im Quellcode vornehmen. Juhuuuu!!!

Morgen wird intensiv getestet und geforscht - ich werde berichten.
LG

MES
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
591 Beiträge
 
Delphi XE6 Enterprise
 
#8

AW: Firedac Query fetch all

  Alt 10. Okt 2017, 12:10
Nehmen wir an, Query1 wäre ein Artikelstamm in dem oft gescrollt wird etc
Ja die Freuden der "visuellen Selektion": viele Anwender suchen lieber in einem Grid mit 100.000 Zeilen nach einer Artikelnummer anstatt diese eben in ein Feld einzugeben, Enter, und da hamwer den Artikel...
  Mit Zitat antworten Zitat
MES

Registriert seit: 23. Dez 2008
Ort: PLZ 73
39 Beiträge
 
#9

AW: Firedac Query fetch all

  Alt 10. Okt 2017, 15:49
Testen und verzweifeln ist angesagt. Ich bin sehr geneigt den FirDreck raus zu hauen. Wir drehen uns noch immer im Kreis, mal tuts und mal nicht

Jetzt sind wir so weit, dass in einem Testprojekt alles funzt, im eigentlichen Projekt aber gar nicht bzw. wie beschrieben.
Im Testprojekt funzt es mit dem FDManager nicht, d.h. es wird automatisch ein Fetch all ausgeführt. Ohne den Manger ist es gut.

Wir bauen jetzt Modul für Modul, Komponente für Komponente in das Testprojekt ein - bis es hoffentlich klar ist was dieses absonderliche Verhalten auslöst.
LG

MES

Geändert von MES (10. Okt 2017 um 15:51 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#10

AW: Firedac Query fetch all

  Alt 10. Okt 2017, 16:14
Also ich hab irgendwo gelesen, das Fetchall Problem ist ein BDE MS Treiber / Provider Problem.
Ggf. habt Ihr irgendwo noch leichen im Keller, ein bisschen BDE, ein alter Treiber, ...
Gruß, Jo
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 09:45 Uhr.
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