Entwickler-Ecke
Datenbanken - Jeder 60te macht Probleme(TQuery)!
subw00fer - Fr 05.09.03 10:24
Titel: Jeder 60te macht Probleme(TQuery)!
Halli Hallo!
Die Situation sieht folgender Maßen aus:
Ich habe auf meiner Datenbank(AS400) mehrere Tabellen, auf die ich mit einem TQUERY zugreife und die Daten in ein Textfile übertrage. Mit den Schlüsseln der ersten Tabelle suche ich in einer zweiten Tabelle die gesuchten Datensatz, wobei einer ca. 460 Felder besitzt. und schreibe diesen gefundenen in die Textfile.
Nun mein Problem:
Es sind einige Tausend Sätze. Die einzelnen Abfragen(TQuery) bewegen sich im Millisekundenbereich, aber bei ca. jeden 60ten Satz benötigt das TQuery ca. 40 Sekunden. Da diese Situation sehr oft autritt brauche ich min. 30 Minuten länger und ich weiss nicht wie ich dieses Phänomen unterbinde.
Es sind nie die gleichen Datensätze die das jeweilige TQuery verzögern.
Kann mir jemand helfen?
mfg subw00fer
P.S.:Kann es sein, dass diese Abfragen den Buffer vollschreiben und nach einer gewissen Grösse wird dieser geloschen -> Zeitverzögerung?
hansa - Fr 05.09.03 12:35
Titel: Re: Jeder 60te macht Probleme(TQuery)!
| subw00fer hat folgendes geschrieben: |
| P.S.:Kann es sein, dass diese Abfragen den Buffer vollschreiben und nach einer gewissen Grösse wird dieser geloschen -> Zeitverzögerung? |
Da bin ich mir sogar ziemlich sicher, daß das so ist. Bzw. ist die Page in der DB dann voll. Bei 460 Feldern und einer Pagesize von standardmäßig 4 kb kriegst du nicht viele da auf einmal rein. Bei solch großen Datensätzen wäre es zu überlegen da etwas mit anderen Werten rumzuexperimentieren. Eine andere Datenstruktur wäre aber wohl das Beste. Die 460 Felder brauchst Du wohl nicht alle gleichzeitig im Zugriff, oder doch?
subw00fer - Mo 08.09.03 08:30
Hallo!
Nocheinmal die Situation:
Ich lese den ersten Datensatz aus der ersten Tabelle und schreibe in sofort in ein Textfile. Mit einen Schlüssel vom ersten Datensatz gehe ich zur nächsten Tabelle und lese den gesuchten Datensatz aus und schreibe ihn in das Textfile, danach gehe ich zur nächsten Tabelle mit dem gleichen schlüssel,usw. Nur einen Tabelle liegt dazwischen, die 460 Felder besitzt und ich muss sie(Felder) auf einmal auslesen. Es funktioniert ja auch perfekt, doch ca. jeder 60te macht Probleme.
Wenn der Buffer das Problem macht. Kann ich ihn nicht jedes mal irgendwie leeren?
MSCH - Mo 08.09.03 13:11
welchen Puffer willst du Leeren? Den der DB (Cache) oder den der Anwendung?, desweiteren schätze ich, dass da noch diverse Parameter des Netzwerkes ne Rolle spielen dürften, als auch die verwendeten (ODBC-?) Treiber.
Interessant dürfte es sein, bei wieviel Bytes Ttransfervolumen dieses Phänomen auftritt. Anhand eines solchen Mittelwertes kann es u.U. sinnvoll sein an der DB resp. Anwendung oder Treiber zu drehen.
eine allgemeine Lösung kann dir hier glaube ich keiner Geben.
grez
msch
hansa - Mo 08.09.03 13:24
Wie gesagt, meiner Meinung nach hilft nur experimentieren mit der DB-PageSize. Anscheinend passen im Moment genau 60 Datensätze da rein. Was aber auch bedeutet, daß die DB die Daten sammelt und dann speichert. Wird die PageSize verringert, so dürfte dieses "stocken" verringert/unmerkbar sein. Insgesamt gesehen wäre es aber langsamer. Wie bei Pech und Schwefel halt. Ein Netzwerk hat auch so eine Pagesize. Damit habe ich schon experimentiert konnte aber keine Änderung feststellen.
subw00fer - Mo 08.09.03 14:20
Ich fragte unsere As400-Spezialisten wegen der DB-PageSize, die haben leider auch nichts positives herausbekommen.
Habe es nun anders gelöst. Verwende ein select * auf die grosse Datei mit den 460 Feldern und schreibe jeden Satz in ein dynamisches Array.
Ergebnis: Von mehr als 3 Stunden Laufzeit auf weniger als 30 Minuten gekürzt.
Danke trotzdem.
mfg subw00fer
P.S.: Ist zwar umständlich, aber es funktioniert!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!