Migration VB Anwendung von MSDE/MSSQL-Server zu PostGreSQL

Hallo zusammen,
hoffe mal das das Thema hier rein paßt… Ansonsten schonmal Entschuldigung! :slight_smile:

Und zwar stelle ich eine VB6 Anwendung von MSDE/MS-SQLServer auf PostGreSQL 8.1.4 um… klappt auch bisher super. Zugriff geht dabei über den ODBC-Treiber mit ADO.

ABER : In einer Kundendatenbank habe ich in einer Tabelle rund 2 Mio Datensätze. Wenn darin Änderungen vorgenommen werden läuft das sehr schleppend… beim SQL-Server aber recht schnell.

Zugriff geht bei mir so ähnlich:

sql = " Select * from xTabelle where Schluessel = " + CStr(ID)
Set rs = New adodb.Recordset
rs.Open sql, glbDBConn, adOpenDynamic, adLockOptimistic
If not rs.EOF Then
rs(“Spalte”) = Wert
… n weitere Spalten
rs.Update
End If
rs.Close
set rs=nothing

Indizes wurden gesetzt… Unter PostGres rund 2min und mit der MSDE rund 3sek. Gleiche Maschine.

Nun meine Frage: Ist das unter Postgres so langsam, muss ich evtl. alle Änderungen auf UPDATE-Statements umbauen oder gibt es unter VB mit Postgres ne andere Lösung wie man sowas macht???
Habt Ihr Erfahrungen mit PostGreSQL und VB6 Projekten was man evtl. sonst noch beachten muss???

Schönen Dank für eure Hilfe
Markus

Ich frage mich, wieso du nicht direkt ein Update absetzt?

In deinem geschilderten Fall wäre ein

UPDATE xTablle SET “Spalte” = Wert WHERE Schluessel = ID

wohl um ein vielfaches eleganter sowie schneller. Das diese Art und Weise auf dem MS-Sql schneller von statten geht, würde ich nicht unbedingt als Referenz betrachten.

Hi,
die meisten Abfragen stelle ich auch grad darauf um.
Nur wurde in der bisherigen Programmierung einiges so ähnlich gebaut:

sql = " Select * from xTabelle where Schluessel = " + CStr(ID)
Set rs = New adodb.Recordset
rs.Open sql, glbDBConn, adOpenDynamic, adLockOptimistic
If rs.EOF Then
'## also direkt neu anlegen
rs.Addnew
rs(“xSchluessel”) = rs(“id”)*Codierung '## <-- ist ein Autoincrement Feld
rs(“AnlageDatum”) = now
else
rs(“AenderungsDatum”) = now
endif
rs(“Spalte”) = Wert
… n weitere Spalten
… davon teilweise ca. 50 Felder
rs.Update
End If
rs.Close
set rs=nothing

… und das muss ich nun komplett umbauen.
Ich denk mal das ich da bei Postgres nicht um Trigger rumkomme.
Dachte das es evtl. ne einfachere Möglichkeit der Umstellung gibt.
Gruss
Markus

Ich denke du gehst den richten Weg, derartige Dinge nach Möglichkeit auf direktem Wege zu lösen und nicht über irgendwelche adodb Funktionen. Mal abgesehen, dass du anschließend nicht unbedingt an ein Frontend “gekettet” bist.

Was an einem Trigger ist denn so schlimm? Fakt ist: der Trigger wird immer ausgeführt, sobald entsprechendes Ereignis eintritt -> deine Daten bleiben also möglichst konsitent - egal, wie auf die DB zugegriffen wird. Solch grundlegende Sachen gehören m.E. immer auf Serverseite, nicht auf Clientseite. Ein sauberes DB Design ist zwar anfangs mit ein Wenig Mehrarbeit verbunden, ich habe aber festgestellt, dass es sich lohnt. Mal von der Performance ganz zu schweigen (ich habe ein Access Frontend, was auch provisorisch zusammengezimmert war - das Abarbeiten verschiedener Dinge über Access dauert gut eine Halbe Stunde. Gleiche Implementation serverseitig nur wenige Minuten)…

Hi Pepperbob,
an Triggern ist im Grunde nix schlimmes dran… Wirft nur etwas meinen Zeitplan durcheinander. Aber egal… 8)
Das DB Design war bisher für die MS Welt ok. Wenn man sich aber zunehmend auf anderen Plattformen bewegen will muss man halt umdenken.
Danke für die Hilfe
Gruss
Markus

… nur mal zur Info : Es lohnt sich umzustellen!!! :smiley:
Durch Einsatz von Triggern und Umbau auf INSERT/UPDATE Statements liegt die Reaktionszeit bei beschriebener Abfrage nun bei unter 1 Sekunde statt vorher fast 2 Minuten.
Gruss
Markus