AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Speicherfresser : TQuery und MSSQL
Thema durchsuchen
Ansicht
Themen-Optionen

Speicherfresser : TQuery und MSSQL

Ein Thema von 2_daniel · begonnen am 30. Jan 2007 · letzter Beitrag vom 14. Feb 2007
Antwort Antwort
Seite 1 von 2  1 2      
2_daniel

Registriert seit: 15. Sep 2004
Ort: FFM
16 Beiträge
 
Delphi 2005 Professional
 
#1

Speicherfresser : TQuery und MSSQL

  Alt 30. Jan 2007, 14:07
Datenbank: MSSQL Server • Version: 2005 • Zugriff über: BDE / ODBC
Hallo an alle,
ich habe folgendes Problem festgestellt:

1. Query öffnen ( select Feld1,..., Feldn from Tabelle ) => dieser Select bringt viele Datensätze zurück( über 15 tausend )

2.Query öffnen( select id from Tabelle2). also diese Query hat mit der 1. nicht zu tun. Auch wenn der SQL-Statement,, der 2. Query, falsch ist passiert folgendes:

die 1. Query lädt sich alle Daten vom server herunter. Dies bewirkt dass der Speicher enorm in der Höhe geht. Und dann kommt die schöne Meldung: Not enough Memory for this operation. Feierabend.

Falls die 2. Query einen Tippfehler hat, kommt die MEldung: SQL Fehler erst nachdem alle Daten der 1. Query "heruntergeladen" wurden.


Als DB-Server habe ich einen MSSQl 2005er im einsatz.
Komponenten: TQuery
Ausser der 2 Querys ist keine weitere Komponente im Spiel. DAfür habe ich mir einen dummy-Projekt erstellt,um Seiteneffekte zu vermeiden.


Hat jemand einen Tipp wo/wie das lösen ist??

Auch wichtig: unter ASA( iAnywhere) passiert sowas nicht....

gruss & besten Dank ,
daniel
  Mit Zitat antworten Zitat
Pfoto

Registriert seit: 26. Aug 2005
Ort: Daun
541 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Speicherfresser : TQuery und MSSQL

  Alt 30. Jan 2007, 14:29
Hallo Daniel!

Erstmal die Frage:
Ist es denn nötig, so viele Datensätze zurückzuliefern?
Wenn nicht, dann grenze doch deine Abfrage etwas ein,
notfalls mit dem Statement SELECT * TOP 500 (sowas in der Art)

Da die Querys idR. hinereinander ausgeführt werden,
kommt ein evtl. Fehler bei der 2. Query natürlich immer etwas
verzögert.


Aber wenn du wirklich alle Tabellen-Daten brauchst, könntest
du stattdessen besser eine TTable-Komponente nehmen (wenn
du keine Joins über mehrere Tabellen machen musst)

Gruß
Pfoto
Jürgen Höfs
Jürgen Höfs / picoly.de
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Speicherfresser : TQuery und MSSQL

  Alt 30. Jan 2007, 14:35
Warum geifst du nicht direkt auf den DB-Server zu und bedienst dich gleich 2 veralteter Techniken?
Markus Kinzler
  Mit Zitat antworten Zitat
hoika

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

Re: Speicherfresser : TQuery und MSSQL

  Alt 30. Jan 2007, 14:36
Hallo,

Query.UniDirectional auf True setzen,
dann chached die Bde die Einträge nicht lokal.


Heiko
Heiko
  Mit Zitat antworten Zitat
2_daniel

Registriert seit: 15. Sep 2004
Ort: FFM
16 Beiträge
 
Delphi 2005 Professional
 
#5

Re: Speicherfresser : TQuery und MSSQL

  Alt 30. Jan 2007, 15:10
Zitat von hoika:
Hallo,

Query.UniDirectional auf True setzen,
dann chached die Bde die Einträge nicht lokal.
Heiko
...dies ist Teils einer Datenverwaltung, darum fällt Unidirectional aus.



Zitat von mkinzler:
Warum geifst du nicht direkt auf den DB-Server zu und bedienst dich gleich 2 veralteter Techniken?
..weil ich noch eine ASA( iAnywhere) DB unterstützen muss, und mom. alles npch über BDE geht. Tja, irgendwann wirds wohl soweit sein....
Zitat von Pfoto:
Hallo Daniel!

Erstmal die Frage:
Ist es denn nötig, so viele Datensätze zurückzuliefern?
Wenn nicht, dann grenze doch deine Abfrage etwas ein,
notfalls mit dem Statement SELECT * TOP 500 (sowas in der Art)

Da die Querys idR. hinereinander ausgeführt werden,
kommt ein evtl. Fehler bei der 2. Query natürlich immer etwas
verzögert.


Aber wenn du wirklich alle Tabellen-Daten brauchst, könntest
du stattdessen besser eine TTable-Komponente nehmen (wenn
du keine Joins über mehrere Tabellen machen musst)

Gruß
Pfoto
das mit 2 Queries hintereinander ist nur wann die Speicherverwaltung anfängt zu spinnen. IdR ist es so, dass eine Query die Daten in einem Grid anzeigt, und über eine Table/DB-Sensitive Felder die Daten verwaltet werden.hier kann es passieren dass eine Zusatzquery gefuert wird...unda dann geht der Speicher in die Höhe....und sowas sieht dann nicht schön aus.

Select Topx wird ( noch nicht benutzt) weil über alle Daten noch eine Suchfunktion läuft...und die würde dann Sätze nicht finden, wenn Topx angewendet wird....oder man müsste die umbauen....FAKT: Topx wird noch nicht benutzt. dies ist aber eine Überlegung wert. DANKE!!


TTables auf viele Datensätzen...braucht eine Ewigkeit bis die geöffnet wird. Also eine schlechtere Alternative.


Meinproblem bleibt weiterhini: WIESO holt sich der SQL-Server die Daten lokal, wenn ein anderes Statement einer anderen Query gestertet wird. Liegt es am MSSQL allgemein, oder ist es eine "gelungene" Einstellung auf meiner Machine( aufm anderen Rechner passiert dasgleiche..also.... )

danke auch für die schnellen Antworten... Problem bleibt weiterhin vorhanen

gruss
daniel
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Speicherfresser : TQuery und MSSQL

  Alt 30. Jan 2007, 15:32
Hi,

wie bingst du denn die Abfrage in die Query?
Wenn du jedesmal das selbe Query-Objekt verwendest und nur die neue Abfrage mit SQL.Add(...) hinzufügst, dann bleibt die erste Abfrage weiterhin drin stehen. Versuchs mal mit SQL.Clear dazwischen.
Gruß
Norman
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Speicherfresser : TQuery und MSSQL

  Alt 30. Jan 2007, 15:38
Zitat:
Versuchs mal mit SQL.Clear dazwischen.
Oder gleich der Eigenschaft Text zuweisen.
Markus Kinzler
  Mit Zitat antworten Zitat
2_daniel

Registriert seit: 15. Sep 2004
Ort: FFM
16 Beiträge
 
Delphi 2005 Professional
 
#8

Re: Speicherfresser : TQuery und MSSQL

  Alt 30. Jan 2007, 16:15
Zitat von NormanNG:
Hi,

wie bingst du denn die Abfrage in die Query?
Wenn du jedesmal das selbe Query-Objekt verwendest und nur die neue Abfrage mit SQL.Add(...) hinzufügst, dann bleibt die erste Abfrage weiterhin drin stehen. Versuchs mal mit SQL.Clear dazwischen.
...dass wird doch immer clean ausgeführt ...mit .Text := '...';

das Problem liegt NICHT daran, dass die Queries nicht laufen, sondern dass der Speicher extrem in die Höhe geht( siehe Problembeschreibung ).

gruss,
daniel
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#9

Re: Speicherfresser : TQuery und MSSQL

  Alt 30. Jan 2007, 16:43
Grundsätzlich funktionieren Abfragen so:
1.) der Client sendet seine SQL-Anweisung an den Server
2.) der Server führt die SQL-Anweisung aus
3.) wenn die SQL-Anweisung ein Resultset (alles was mit SELECT beginnt) hat, wird die komplette Datenmenge an den Client übertragen
4.) der Server ist fertig und der Client speichert das gesamte Resultset zwischen
Das nennt man "client seitigen Cursor"

Es gibt auch "serverseitige Cursor"
3.) der Server speichert das gesamte Resultset zwischen und gibt auf Anforderung immer nur Teile an den Client.
4.) wenn der Client das Resultset schliesst, darf der Server das Resultset freigeben
Wie man sieht, ist bei dieser Variante der Speicherbedarf vom Client auf den Server übergegangen.
Bei vielen Clients droht hier Serverüberlastung.

Wenn du also ein Speicherproblem auf dem Client hast, solltest du
1.) die Anzahl der Spalten reduzieren
2.) die Anzahl der Datensätze reduzieren
3.) Arbeit vom Client zur Server delegieren (Stored Procedures)
4.) Hardware aufrüsten
Andere Lösungen gibt es nicht.
Andreas
  Mit Zitat antworten Zitat
hoika

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

Re: Speicherfresser : TQuery und MSSQL

  Alt 31. Jan 2007, 07:14
Hallo,

genau so sieht es aus.

"Suchfunktion über alle Datensätze" -> SP oder einfache Query (Select Sum)

Mit Unidirectional=False cachet die Bde alle geladenen Datensätze,
damit man z.B. mit Prior einen Datensatz zurück gehen kann.

Ich hatte auch mal was von nem Speicherleck der Bde gehört,
Abhilfe war damals das explizute Prepare / UnPrepare gewesen.


Heiko
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 01:41 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