Shared Memory aufgebraucht

Hallo zusammen

Ich nutze postreSQL 8.4.
Eine pl/pgsql Funktion verarbeitet die in Tabellen eingelesenen Basisdaten zu Rechnungsdaten.
Das sind ca 6000 Positionen pro Monat von denen jede durch eine Preisermittlung l�uft.
Da sind ca. 30 Funktionen beteiligt die mehrere Cursoren �ffnen (und wieder schliessen)
2 Funktionen erstellen (6000 mal) eine tempor�re Tabelle und droppen diese wieder.
Die Daten fliessen in Tabellen, mit jeweils einem Trigger der zumindest beim update einen Timestamp schreibt.
Wenn die Funktion etwas mehr als einen Monat verarbeitet tritt die oben genannte Exception “Shared Memory aufgebraucht” auf.
Erh�he ich max_locks_per_transaction dann tritt der Fehler erst sp�ter auf.

Anscheinend gebe ich Resourcen nicht wieder frei, bin aber ratlos wo hier mein Code versagt.

Gr��e
Uli

Es sticht ja schon aus dem Text heraus, 6000 mal eine temporäre Tabelle erzeugen gibts wohl nicht umsonst.
Das läuft immerhin in einer Transaktion.
Ich habe mit kleinen Umbauten die temporären Tabellen durch eine For in select … Schleife ersetzt.
Damit sind 3 Monate durchgelaufen. Alles prima, kein Fehler.

Kann mir jemand das Verhalten erklären?

Gruß
Uli

Wie groß ist dein Shared Memory?

shared_buffers = 32MB, also Standardeinstellung.
Das bezieht sich auf meinen Windows Entwicklungsrechner bei dem ich keinerlei Veränderungen an der postgresql.conf vorgenommen habe.

Uli

Was passiert, wenn du das auf mehrere Hundert MB erhöhst? :wink:

Die Faustregel ist ja etwa 25% vom RAM (bei einem dedizierten PG-Server), mit einigen Randbedingungen (nicht mehr als 2 GB bei 32Bit-Rechnern, nicht mehr als 8 GB allgemein). 32 MB ist SEHR wenig.


Andreas

@ads
shared_buffers = 1024MB
Auch hier kommt der Fehler (getestet mit der Funktion mit der temporären Tabelle)
2012-03-18 15:46:09 CET WARNUNG: Shared Memory aufgebraucht
2012-03-18 15:46:09 CET ZUSAMMENHANG: SQL-Anweisung »create temporary table tmpTarife as select …
Leider weiß ich nicht nach wievielen Datensätzen der Fehler auftritt.
Das Logging ist durch das Rollback halt weg.

@akretschmer
ich dachte mir, wenn das auf meinem Entwicklungsrechner bei schlechten Standardeinstellungen gut läuft, dann macht das auf dem Produktivserver mit (ich hoffe) richtiger Konfiguration nochmal mehr Spaß.
Das ist in dem Fall möglicherweise falsch gedacht.

Uli

Die 32 MB sind die Voreinstellung - und diese wählt PostgreSQL sehr konservativ.

Vielleicht kannst du mal schauen ob du die ganzen komplexen Operationen etwas zusammenfassen kannst. Du musst berücksichtigen das alles innerhalb einer Transaktion abläuft und die Ressourcen in der Regel erst am Transaktionsende freigegeben werden (können).

weg von der Erzeugung der vielen temporären Tabellen scheint mir schon mal der richtige Ansatz zu sein.
Am besten begrenze ich eine Transaktion auf maximal 1 Monat, dann bin ich auf der sicheren Seite.

Vielen Dank für eure Arbeit

Uli