AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi FireDAC Query Speicher freigeben
Thema durchsuchen
Ansicht
Themen-Optionen

FireDAC Query Speicher freigeben

Ein Thema von haentschman · begonnen am 10. Jul 2018 · letzter Beitrag vom 12. Jul 2018
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.201 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: FireDAC Query Speicher freigeben

  Alt 10. Jul 2018, 20:35
FireDAC lädt gerne die gesamte Datenbank nur um sie dann auf Client-Seite zu filtern oder zu sortieren.
FireDAC kann auch nur maximal soviel Daten laden wie der SQL-Server hergibt. Wenn eine Query nur einen Record liefert, dann müssen das schon ziemlich viele und große Felder sein um 1 GB voll zu bekommen.
Evtl. ein Blob-Feld beteiligt.
Hatte auch mal eine Komponente deren Verhalten war: "Uh, da kommt bein Memo/Blob-Feld, schnell mal ein paar MB vorsichtshalber reservieren..."
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#12

AW: FireDAC Query Speicher freigeben

  Alt 10. Jul 2018, 21:10
Hallo,

dazu lese ich folgendes.

fmAll – Alle Rowsets werden automatisch direkt nach Ausführung der SQL-Anweisung abgerufen. Dies entspricht dem Aufruf der Methode FetchAll.

Hinweis: Nicht alle DBMSs unterstützen das Abrufen von Rowsets. FireDAC kann dies aber zulasten der Geschwindigkeit emulieren. Emuliertes Abrufen von Rowsets führt zu einer Geschwindigkeitsreduktion von 50 % im Vergleich zum tatsächlichen Abrufen.


Also ja, könnte am fmAll liegen.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#13

AW: FireDAC Query Speicher freigeben

  Alt 10. Jul 2018, 21:38
fmAll – Alle Rowsets werden automatisch direkt nach Ausführung der SQL-Anweisung abgerufen. Dies entspricht dem Aufruf der Methode FetchAll.
Wenn die Query nur einen Record zurückliefert, ist der FetchMode vollkommen egal.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

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

AW: FireDAC Query Speicher freigeben

  Alt 11. Jul 2018, 08:38
@Der schöne Günther:
Zitat:
Ich kann morgen noch einmal nachschauen was ich bei mir ändern musste damit er aufhört.
...bitte, bitte.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#15

AW: FireDAC Query Speicher freigeben

  Alt 11. Jul 2018, 08:55
Ich habe in der Versionsverwaltung meines Vertrauens zwei Dinge gefunden:

Zitat:
Wir entfernen die FireDAC-Indizes denn das scheint dafür zu sorgen dass FireDAC sich alles ins RAM schaufeln will (wofür auch immer)
  • Auf allen TFDQuery und TFDTable -Objekten explizit IndexesActive = False gesetzt
  • Auf allen TFDQuery und TFDTable -Objekten evtl. vorhandene Werte für IndexFieldNames entfernt


und


Zitat:
FetchOptions.RecsMax = 100 gesetzt für Tabelle profileValues da sonst ein
POST FireDAC veranlasste, die gesamte Tabelle in den Speicher zu laden
Hier wurde bei einer bestimmten Tabelle folgendes gesetzt:
Delphi-Quellcode:
+ FetchOptions.AssignedValues = [evRecsSkip, evRecsMax]
+ FetchOptions.RecsSkip = 0
+ FetchOptions.RecsMax = 100
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#16

AW: FireDAC Query Speicher freigeben

  Alt 11. Jul 2018, 10:57
Wir entfernen die FireDAC-Indizes denn das scheint dafür zu sorgen dass FireDAC sich alles ins RAM schaufeln will (wofür auch immer)
Natürlich muss FireDAC alle Datensätze (also die von der Query gelieferten) im Speicher haben, damit sie lokal sortiert werden können. Wie sollte das auch sonst gehen. Das entspricht quasi einem FetchAll. Übrigens kann auch ein Aufruf von RecordCount unter bestimmten Umständen dieses auslösen.

Das erklärt aber nicht, warum eine Query, die einen einzigen Datensatz zurückliefert, über 1 GB Speicher benötigt.

Daher mein Vorschlag, die Query isoliert außerhalb des Programms bzw. in einem Testprogramm auszuführen. Entweder braucht sie dort auch diesen Speicher, dann muss man sehen, welche Felder das verursachen. Ist der Speicherverbrauch der Query selbst aber deutlich geringer, liegt das Problem innerhalb des Programms und man kann dann sukzessiv die übrige Funktionalität einbinden, bis der Auslöser für den enormen Speicherverbrauch gefunden ist.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

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

AW: FireDAC Query Speicher freigeben

  Alt 11. Jul 2018, 14:52
Zitat:
Das erklärt aber nicht, warum eine Query, die einen einzigen Datensatz zurückliefert, über 1 GB Speicher benötigt.
...richtig.
Lösung:
Die Form hat eine Datenmenge geöffnet, ohne WHERE, die NICHTS dieser Form zutun hatte. Die Datenmenge Tabelle Mail mit 35000 Datensätzen und reichlich großen Feldern und Blobs. (Ich tippe auf Copy/Paste Fehler meines Vorgängers) Das war aber so im Code versteckt... Nun haben wir mit 3500 Datensätzen in der Hauptdatenmenge (300 Felder) 450MB... Damit kann ich leben.

Sorry, das hatte ich nicht auf dem Schirm.

Danke an Alle.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: FireDAC Query Speicher freigeben

  Alt 11. Jul 2018, 21:37
Zitat:
Der Zauberlehrling
Hat der alte Hexenmeister
sich doch einmal wegbegeben!
Und nun sollen seine Geister
auch nach meinem Willen leben.
Seine Wort und Werke
merkt ich und den Brauch,
und mit Geistesstärke
tu ich Wunder auch.
Walle! walle
Manche Strecke,
daß, zum Zwecke,
Wasser fließe
und mit reichem, vollem Schwalle
zu dem Bade sich ergieße.

Und nun komm, du alter Besen!
Nimm die schlechten Lumpenhüllen;
bist schon lange Knecht gewesen:
nun erfülle meinen Willen!
Auf zwei Beinen stehe,
oben sei ein Kopf,
eile nun und gehe
mit dem Wassertopf!

Walle! walle
manche Strecke,
daß, zum Zwecke,
Wasser fließe
und mit reichem, vollem Schwalle
zu dem Bade sich ergieße.

Seht, er läuft zum Ufer nieder,
Wahrlich! ist schon an dem Flusse,
und mit Blitzesschnelle wieder
ist er hier mit raschem Gusse.
Schon zum zweiten Male!
Wie das Becken schwillt!
Wie sich jede Schale
voll mit Wasser füllt!

Stehe! stehe!
denn wir haben
deiner Gaben
vollgemessen! -
Ach, ich merk es! Wehe! wehe!
Hab ich doch das Wort vergessen!

Ach, das Wort, worauf am Ende
er das wird, was er gewesen.
Ach, er läuft und bringt behende!
Wärst du doch der alte Besen!
Immer neue Güsse
bringt er schnell herein,
Ach! und hundert Flüsse
stürzen auf mich ein.

Nein, nicht länger
kann ichs lassen;
will ihn fassen.
Das ist Tücke!
Ach! nun wird mir immer bänger!
Welche Miene! welche Blicke!

O du Ausgeburt der Hölle!
Soll das ganze Haus ersaufen?
Seh ich über jede Schwelle
doch schon Wasserströme laufen.
Ein verruchter Besen,
der nicht hören will!
Stock, der du gewesen,
steh doch wieder still!

Willst am Ende
gar nicht lassen?
Will dich fassen,
will dich halten
und das alte Holz behende
mit dem scharfen Beile spalten.

Seht da kommt er schleppend wieder!
Wie ich mich nur auf dich werfe,
gleich, o Kobold, liegst du nieder;
krachend trifft die glatte Schärfe.
Wahrlich, brav getroffen!
Seht, er ist entzwei!
Und nun kann ich hoffen,
und ich atme frei!

Wehe! wehe!
Beide Teile
stehn in Eile
schon als Knechte
völlig fertig in die Höhe!
Helft mir, ach! ihr hohen Mächte!

Und sie laufen! Naß und nässer
wirds im Saal und auf den Stufen.
Welch entsetzliches Gewässer!
Herr und Meister! hör mich rufen! -
Ach, da kommt der Meister!
Herr, die Not ist groß!
Die ich rief, die Geister
werd ich nun nicht los.

"In die Ecke,
Besen, Besen!
Seids gewesen.
Denn als Geister
ruft euch nur zu diesem Zwecke,
erst hervor der alte Meister."

Johann Wolfgang von Goethe
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

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

AW: FireDAC Query Speicher freigeben

  Alt 12. Jul 2018, 07:00
...da sieht man man wieder. Ich hätte in der Schule besser aufpassen sollen.

Zu meiner Verteidigung:

Delphi-Quellcode:
if NOT(DMED.FDQBelKopf.Active) then
      DMED.FDQBelKopf.open();
    if NOT(DMED.FDQBelPos.Active) then
      DMED.FDQBelPos.open();
    if NOT(DMED.FDQBelArt.Active) then
      DMED.FDQBelArt.open();
    if NOT(DMED.FDQVorgang.Active) then
      DMED.FDQVorgang.open();
    if NOT(DMED.FDQTermin.Active) then
      DMED.FDQTermin.open();
    if NOT(DMED.FDQAdr.Active) then
      DMED.FDQAdr.open();
    if NOT(DMED.FDQEMail.Active) then
      DMED.FDQEMail.open(); // die hier
    if NOT(DMED.FDQTeil.Active) then
      DMED.FDQTeil.open();
    if NOT(DMED.FDQBelStatus.Active) then
      DMED.FDQBelStatus.open();
    if NOT(DMED.FDQZahlung.Active) then
      DMED.FDQZahlung.open();

    if NOT(DMLUP.FDQDatevPlus.Active) then
      DMLUP.FDQDatevPlus.open();
    if NOT(DMLUP.FDQDatevMinus.Active) then
      DMLUP.FDQDatevMinus.open();
...da kann man so etwas mal übersehen.

Geändert von haentschman (12. Jul 2018 um 07:05 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 16:07 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