PostGres ODBC über Internet sehr langsam

Hallo,

ich nutze Postgres zur Speicherung von vielen Datensätzen. Dabei nutze ich einen Internetserver als Zwischenstation. Wenn von diesem Internetserver die Datensätze ziehe, dann zieht mein Programm gerade mal 1 Datensatz(Zeile) pro Sekunde. Und ich habe es mit über 30.000 Datensätzen pro Woche zu tun und in Zukunft noch viel mehr.

Das ist doch schade, da kann doch was nicht stimmen. Das muss doch ruckzuck gehen bei einer 2000kbit Leitung. Muss ich was einstellen beim Server um mehr Bandbreite speziell in Postgres freizugeben???


Gruß,
Eser

Ich bezweifle, das dieses Problem an der Bandbreite liegt … ausser, diese wird irgendwo bis in den Bytebereich eingeschränkt.

Wie genau rufst du diese Daten ab?
Wieviele Daten befinden sich in der Tabelle?
Tritt diese Verzögerung auch auf, wenn du lokal auf dem Datenbankserver arbeitest?

Nein, lokal läuft natürlich alles schnell.

Nur übers Internet ist es immer langsam.

Die Datenmenge variiert. Aber man hat es momentan pro Woche mit 30.000 Zeilen zu tun. Ich kann beobachten wie schnell das ist, weil die Daten gelesen und dann einzeln gelöscht werden. So sehe ich bei Count immer die Zahl runter gehen. Und das entsprich so ungefähr 1 Datensatz pro Sekunde und das ist ja wirklich arm.

Im Grund lade ich ja runter und das ist ja ein Root Server mit jede Menge Upload. Das müsste flott gehen. Muss man vielleicht in postgresql.conf spezielle Performance Einstellungen vornehmen?


Danke und Gruß

Ähm, langsam mal. Wenn es lokal schnell läuft, dann liegt dein Problem woanders.

Ok, was genau machst du auf dieser Datenbank (Beispiel Script, ausgeführte SQL Befehle oder so)?
Wie greifst du übers Internet auf diese Datenbank zu?

Ich greife mit dem psql-ODBC Treiber auf die Datenbank zu. Eine DSN liegt bereit und wird genutzt.

Es wird immer ein Datensatz geholt, in dem die Info steht, in welcher Tabelle die eigentliche Info vorliegt, dann holt er sich diese, bei Erfolg löscht er dann den Datensatz in dem die Info ist woher er diese holen soll, usw. usw.

So läuft das dann die ganze Zeit ab, bis die Tabelle leer, die ja diese Infos enthält.

Im Grunde für einen Datensatz insgesamt 3 Queries. Simple Select und am Ende Delete Anweisungen.

Ich kenne diesen Treiber nicht, wie genau verhält der sich? Wie verhält sich deine Applikation?

Wenn ich deine Beschreibung richtig verstanden habe, läuft das ganze so ab:

  • herausfinden, welcher Datensatz benötigt wird (1 Query)
  • Datensatz holen (1 Query)
  • Datensatz löschen (1 Query)

Stimmt das?

Noch eine Frage: bleibt die Datenbank Verbindung zwischendurch offen? Oder wird die jedesmal neu aufgemacht?

Hi,

das ist eine Verbindung die aufgebaut wird, um z.B. auf einmal alle Datensätze zu holen. Diese 3 Queries von dir stimmen. So läuft das im Grunde ab. Der psql-ODBC Treiber ist doch bei PostgreSQL dabei, wenn man den installiert, sieht man diesen Treiber bei den Datenquellen unter Systemsteuerung/Verwaltung.

Der möge ja dabei sein, aber ich habe kein Windows und kann demzufolge dazu keine Aussage treffen. Was mir in dem Zusammenhang noch einfällt: bei mir sind Datenbankverbindungen über asynchrone Leitungen (DSL) auch ein gutes Stück langsamer, weil der Rückkanal halt eine bescheiden schlechte Datenrate hat. Aber so schlecht sollte das nun wirklich nicht sein.

Kannst du mal messen, wie lange jeder einzelne Query bei dir braucht? Und ist es möglich, die Applikation so umzuschreiben, das vielleicht mehrere Datensätze auf einmal geholt werden? Weil du musst ja nun jedesmal eine Anfrage an die DB schicken, die wird ausgewertet und die Daten gehen zurück. Das kostet über das Internet doch einige Millisekunden mehr als über ein LAN und summiert sich auf.

Dann fallen mir noch prepared Queries ein, aber ob die da noch viel helfen …

Eine Query dauert so um 0,35 Sekunden (abgeschätzt) und es variiert auch im pgAdmin unten rechts (die Anzeige).

Ob man viele Datensätze holt und nur einzelne, ändert nichts. Immer das gleiche Problem? :-/

Wonach variiert das? Und kannst du das ausser im pgadmin auch in deiner Applikation messen?

Ach so, kannst du auch die betreffenden Codestellen aus deiner Applikation hier einmal pasten?

Danke

while((record = updatetable.getNext()) != null)
			{
				recordreader = remotedata.executeReader(record.getSelectquery());
				//Console.WriteLine("Getting SelectState: "+record.getSelectquery());
				writetolocal(recordreader,record);
				recordreader.Close();
				try
				{
					remotedata.executeNonQuery(record.getUpdatetableDeletequery(this.updatetablename,this.updatetablekey));
				}
				catch(Exception e)
				{
					logfile.write("1:"+e.Message);
				}
			}

writetolocal schreibt einen Datensatz in die DB. Und falls ein gleicher existiert, löscht er diesen vorher. Das ist die eigentliche Arbeit.
Aber ich vermute mittlerweile, mein Programm ist einfach ineffizient. Oder?

So pauschal würde ich das auch mal annehmen. Grund: du holst alle Daten aus der DB, um sie dann wieder zu schreiben.

Kannst du das ev. auch innerhalb der DB lösen oder zumindest dort mit Stored Procuedures Hilfsarbeiten leisten?

Keine schlechte Idee. Ich benutze schon jetzt viele dieser StoredProcedures, die würde mir bestimmt Arbeit abnehmen.

z.B. schon automatisch die Zeilen liefern die ich einfach brauche, selber testen tu ich dann nicht mehr.

Thx

hi zusammen,

zufällig habe ich die Probleme mit der Datenbank im Internt mitbekommen und danke du solltest noch mal die Internetkonfiguration auf Client und Serverseite überprüfen.
(Was setzt du übrigens als Client ein ?)
Ich habe bei mir zuhause einen Rechner stehen auf dem eine PG läuft und diese ist über DynDns und ganz normale 1MBit DSL aus dem Internet erreichbar. Diese kommt so auf 200 - 300 Datensätze pro Sekunde, wenn ich über ODBC die Daten abrufen. (Hier spielt evtl. eine Rolle wie groß die Tabelle ist ?)

Ich denke hier (Internet) liegt das Problem und nicht bei der Datenbank sondern du solltest mal schauen, wie lange z.B, ein Ping braucht, bis er zurückkommt (was ist als Nameserver eingetragen?), div. Firewalls etc. könnten auch die Finger drin haben, außerdem solltest du auch mal die IP-Zugriffsliste deines PG überprüfen (näheres findest du auch hier im forum, oder in der Hilfe) auch da kann man anscheinend ne ganze Menge verkonfigurieren.

Gruss Jürgen