Frage zu work_mem!

Hallo,

Ich bin gerade dabei die postgresql.conf ein wenig zu tunen. Jedoch habe ich noch ein paar Fragen bezüglich work_mem. Erstmal allg. Daten zum Sever:

2 CPU´s
4GB RAM
2 winzige Datenbanken (1x 20MB & 1x 1,2GB)

Ich habe mit aus der “großen” Datenbank die größte Tabelle herausgesucht und mir die Kosten für eine sortieroperation mit EXPLAIN ANALYZE anzeigen lassen. Da der Speicher work_mem für diese Operation nicht ausreicht laut der Aussage:

Sort Method: external merge  Disk: 234552kB

will ich gerne die richtige größe einstelllen. Allerdings habe ich das jetzt so gemacht das ich mir den Durchschnitt der Zeilen aller Tabellen der Datenbank genommen habe und quasi für den durchschnittlichn Verbrauch des Speichers für eine Sortieroperation genommen und danach dann work_mem dementsprechend eingestellt habe. Ist das empfehlenswert? Oder sollte man sich besser an der größten Tabelle orientieren?

Was mir noch aufgefallen ist, ist das wenn die Opeartion im RAM ausgeführt wird mehr Speicher in anspruch nimmt, anstatt auf der HDD! Warum ist das so?

Gruß
Karl der Heinz!

Bei work_mem aufpassen: dieser kann je Abfrage und je Knoten innerhalb einer Abfrage allokiert werden. Also, komplexe Abfrage kann N mal work_mem allokieren, bei M gleichzeitigen solcher Abfragen also N * M. Man sollte also nicht nur schauen, ob das auf Pladde läuft, sondern auch, wie die anderen Bedingungen sind. Bei 4GB Ram kann also ein work_mem von z.B. 100M recht schnell ins Auge aka SWAP gehen.

Und ja: die Sortieralgos sind im RAM anders als auf Pladde, daher ist es normal, daß da unterschiedliche Größen benötigt werden.

Andreas

Danke!
Ja das eine Abfrage N mal work_mem in anspruch nehmen kann weiß ich. Ich habe jetzt nach ein wenig try und error einen Wert von 60MB eingestellt, der für die meisten Sortieroperationen ausreichen sollte. Und wenns nicht ausreicht muss er halt auf der HDD sortieren, das ist bei der kleinen Datenbank ja noch zu verkraften, da die Abfragen auch nicht so lange dauern.

Du kannst jederzeit das work_mem für eine Session ändern.

Bevor Du das “große” Statement startest, einfach den Wert mit set work_mem=‘100MB’ hochsetzen. Danach dann das Statement laufen lassen.

Details dazu im Handbuch: http://www.postgresql.org/docs/current/static/sql-set.html