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?
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.
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.