Hello!
I used a self written funtion in plpgsql with a database of 2 Gigabyte
size. My server has 384 Megabytes of RAM.
So I got this error by calling the following function:
psql:restructure.sql:139: FATAL 1: Memory exhausted in AllocSetAlloc()
pqReadData() -- backend closed the channel unexpectedly.
This probably means the backend terminated abnormally
before or while processing the request.
psql:restructure.sql:139: connection to server was lost
In the memory usage program Its shown that the function needs all the
memory.
The function fetches all XXX rows of a table
and writes a value to another table
CREATE FUNCTION series_image () RETURNS integer AS '
DECLARE
psr_rec record;
i integer := 0;
BEGIN
FOR psr_rec IN SELECT * FROM relseries_image000 LOOP
UPDATE image
SET seriesoid = psr_rec.parentoid
WHERE chilioid = psr_rec.childoid;
i := i + 1;
END LOOP;
IF NOT FOUND THEN RETURN -1;
ELSE RETURN i;
END IF;
END;
' LANGUAGE 'plpgsql';
What could I optimize in this function above?
I tried the Select statement in the psql command and it has taken 20
minutes. I estimate that there are more than 400000 rows in the table.
Then it breakes , the announcment appears: malloc: Resource temporarily
unavailable
and psql is crashed.
Should I change the postmaster parameters?
actually they are :
./postmaster -i -S -D/usr/local/pgsql/data -B 256 -o -e -o -F
What can I do?
Thanks in advance for any advice
David