Migration von MSSQL Server zu PostgreSQL 8.4 --> 6x mal langsamere Anwendung

Ich habe eine Webanwendung (ASP.NET), die bisher mit Microsofts SQL Server betrieben wurde. Jetzt habe ich sie zu PostgreSQL migriert (d.h.: die Verbindung wird mit Npgsql.dll durchgeführt; alle Statements an die Sprachspezifischen Gegebenheiten von PostgreSQL angepasst).

Die folgende Grafik zeigt von mir gemessenen Geschwindigkeiten. Die Anwendung lief immer im selben Windows Host, der Browser war stets der selbe und die Messungen wurden unmittelbar nacheinander durchgeführt.

  1. Ganz oben ist die Anwendung auf dem Windows Host mit einer PostgreSQL 8.4 Datenbank unter Linux verbunden (2 Server).
  2. In der Mitte läuft auf dem Windows Host der Anwendung selbst auch ein PostgreSQL 8.4 Server mit der Datenbank. Mit diesem Verbunden werden fast immer halb solange Seitenaufrufe erzielt.
  3. Ganz unten ist die Anwendung vor der Migration der Datenbank auf PostgreSQL 8.4. Der MS SQL Server ist wie bei 2. auf dem Windows Host der Anwendung installiert. Diese Geschwindigkeit (oder besser) möchte ich auch mit PostgreSQL erreichen.




Meine Fragen zum Geschwindigkeitsproblem / -unterschied:

  • Wie kann es sein, dass die Anwendung doppelt so schnell ist, wenn die PostgreSQL-Datenbank auf dem gleichen Server läuft? Das kann doch nicht nur das Netzwerk sein. Die Windows-Installation ist unangetastet (Standardeinstellungen) und unter Linux shared_buffers höher gesetzt.
  • Was sind die üblichen Flaschenhalse / Stellschrauben bei PostgreSQL, an denen ich drehen kann. Der SQL-Server scheint irgendwas automatisch besser zu machen. Auffällig ist hierbei, dass der Arbeitsspeicherverbracht des SQL Servers gewaltig wird, bei PostgreSQL 8.4 allerdings kaum / nicht spürbar ist.

Vielen Dank für das Lesen dieses Beitrags. Ich freue mich auf eure Antworten.

Was hast du denn schon direkt in der Datenbank gemessen/nachgeschaut/verändert?

Hallo ads,

vielen Dank für deine Antwort. Auf dem LINUX habe ich den shared_buffer auf 256MB, work_mem auf 5MB und die effective_cache_size auf 1024MB erhöht. Bei dem Windows sind diese auf die Standardwerte (32MB, auskommentiert, auskommentiert) eingestellt. (Bis auf Logging unveränderte Konfiguration.)

Bei beiden Systemen habe ich den logging_collector eingeschaltet und die log_min_duration_statement auf 30 gesetzt.

Das kuriose: Bei der Postgre unter Windows werden mehr Statements gelogged mit einer längeren laufzeit, bei der DB unter Linux deutlich weniger. Dennoch ist der Aufruf schneller, wenn die Datenbank direkt auf dem Server mit der Anwendung läuft.

Na ja, 256 MB und 32 MB sind beides angezogene Handbremsen … Wieviel RAM hat die Maschine? Du kannst bis zu 1/4 RAM für shared_buffers verwenden, maximal rund 4 GB.

Hallo ads,

vielen Dank für deine schnelle Antwort.

Der Windows Host läuft als VM und hat 2 GB. Ich habe den Wert auf 512 erhöht und nun sind die Abfragen eine halbe Sekunde schneller.
Gilt maximal 4 GB auch für eine 64bit-Version von PostgreSQL?
Bei der Linux-Version traue ich mich noch nicht die Werte höher zu stellen, da auf dem host diverse VMs laufen - u.a. die VM mit dem Windows mit der Webanwendung (und der PostgreSQL unter Windows).

Zu meiner ursprünglichen Frage:
Wie kann es sein, dass unter Windows PostgreSQL mit weniger Ressourcen schneller Ergebnisse liefert? Bei der CPU und RAM Auslastung sind mir keine nennenswerten Unterschiede aufgefallen.
Gibt es bis auf shared_buffers noch etwas, was ich einstellen kann, damit PostgreSQL mehr cached? Bei dem MSSQL Server werden immer mindestens 400 MB DDR belegt und wenn die ganze Anwendung richtig benutzt wird mit arbeitsintensiven SQL-Statements sogar bis zu 3,5 GB. PostgreSQL hat mich soeben mit 18 MB begeistert, nachdem die shared_buffers erhöht wurden (vorher wurde nichts dauerhaft im Arbeitsspeicher abgelegt).

PostgreSQL legt die Daten in shared_buffers ab. Außerdem nutzt PostgreSQL extensiv den Cache des Betriebssystems.
Wenn Daten also nicht in shared_buffers liegen, dann kann es trotzdem sein, das diese Daten schon im RAM des Betriebssystems vorliegen.

Ah, das leuchtet ein. Und dann ist PostgreSQl unter Windows schneller, weil er dort zugesicherten Arbeitsspeicher des Betriebssystems nutzen kann, während es in dem Linux Host aufgrund der vielen VMs etwas eng zugeht?

Das hört sich so richtig an.
Ohne konkrete Daten ist das aber nicht endgültig zu belegen.