martes, 2 de abril de 2013

Memoria compartida agotada en PostgreSQL

¿Cuando se da este problema?

Cuando tenes una función con muchas tablas temporales encerradas en un ciclo, por ejemplo:

Abrir Cursor

Recorrer Cursor
{
-- Esta funcion tiene tablas temporables aunque en el mismo se eliminan con un drop
-- siempre quedan en memoria mientras se recorre el cursor
Llamar Funcion();
}

Cerrar Cursor

SOLUCION

Abrir Cursor

Recorrer Cursor
{
-- Pegar directamente la consulta de la función
SELECT * FROM tabla;
}

Cerrar Cursor

4 comentarios:

  1. y si las funciones no tienen ninguna tabla temporal? porque podría pasar este error?. porque si le pongo un Limit a toda la consulta, si sale, pero con mas data ya me sale el error de memoria compartida agotada

    ResponderEliminar
    Respuestas
    1. Hola Omar, segun la experiencia que he tenido, ese error aparece dependiendo del número de veces que se invoque la función o a las funciones, y a la vez depende de las tablas temporales y el tamaño de información que contiene cada como tu mismo lo has mencionado.

      Eliminar
    2. Este comentario ha sido eliminado por el autor.

      Eliminar
  2. Hola Francisco, encontré la solución. Tenias razón sobre las funciones que tienen temporales y que aun haciendo Drop a las tablas, aun guarda espacio en memoria; encontré la funcion con las tablas temporales dentro de 2 funciones mas.

    La solución que encontré fue que en vez de copiar toda la función, creas esa tabla temporal en la funcion principal.
    Siguiendo tu lógica sería así:

    Primero modificamos la manera de crear la tabla en la funcion que contiene la temporal,

    IF NOT EXISTS (Select count(1) from TablaTemporal) THEN
    create local temp TablaTemporal ();
    ELSE
    truncate table TablaTemporal
    END IF

    Luego procedemos a modificar la funcion principal que llama a la Funcion():

    --Crear la misma tabla temporal de la Funcion() aquí antes de entrar al bucle.
    create local temp TablaTemporal ()
    Abrir Cursor

    Recorrer Cursor
    {
    -- Esta funcion tiene tablas temporables aunque en el mismo se eliminan con un drop
    -- siempre quedan en memoria mientras se recorre el cursor,
    Llamar Funcion();
    }

    Cerrar Cursor

    Con eso la función "Funcion()" quedara habilitado para lo que fue creado en un principio, y para las demás funciones que quieran usarla

    ResponderEliminar