Re: ERROR: out of memory

From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Javier Chávez B(dot) <jchavezb(at)gmail(dot)com>
Cc: juapabsan(at)tutopia(dot)com, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: ERROR: out of memory
Date: 2008-10-07 18:38:40
Message-ID: 20081007183840.GD19440@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Javier Chávez B. escribió:
> On Tue, Oct 7, 2008 at 7:02 PM, Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org> wrote:
> > Javier Chávez B. escribió:
> >> 2008/10/7 <juapabsan(at)tutopia(dot)com>:
> >
> >> > finalizaba , usando un cursor (haciendo un join de dos tablas con
> >> > aproximandamente una de 9383423 y la otra unos 3832237 ) junto con dos
> >> > tablas mas de mas o menos los mismos registros (millon y medio aprox).
> >>
> >> Ups !! creo que el problema viene por este lado .. los cursores en si
> >> son una estructura no muy recomendable para consultas de esta
> >> magnitud.. no puedes tratar de ir por otro camino???
> >
> > Al contrario ... si tienes que entregarle un numero muy grande de
> > registros al cliente, es mas recomendable usar un cursor de manera que
> > pueda ir leyendolos de a pocos.
>
> Que ???? eso si que no lo sabia .. :S pero en armar un cursor es una
> estructura que se llena iterativamente o no???

Hmmm.

Un cursor se ejecuta de la misma forma que una consulta común y
corriente. La única diferencia es que al cursor se le piden las tuplas
en conjuntos pequeños a medida que el usuario hace FETCH. En cambio a
una consulta invocada directamente se le piden todas las tuplas de una
sola vez.

La verdad es que en el lado del servidor no hay casi ninguna diferencia
(hay un par de excepciones, que son caracteristicas especiales que se le
piden a los cursores cuando especificas WITH HOLD y/o WITH SCROLL).
Pero para el cliente puede ser muy diferente, porque en el caso de la
consulta directa tiene que ser capaz de recibir todo de una sola vez, y
por lo tanto ser capaz de emplazar (alloc) mucha memoria. En cambio con
el cursor, puede emplazar una cantidad pequeña de memoria recibiendo una
cantidad pequeña de tuplas, luego liberar esa memoria y recibir más
tuplas; y así repetir hasta consumir todas las tuplas del resultado.

¿Se entiende?

> eso en si no tiene mas costo que tentar de hacer todo con una consulta
> quiza mas compleja????

Hmm, si lo que el individuo está haciendo es tomar el resultado del
cursor y luego aplicando un "join" manualmente en la aplicación,
entonces ciertamente sería mejor usar una sola consulta más compleja.
Pero no es eso lo que yo entendí del primer post.

--
Alvaro Herrera http://www.amazon.com/gp/registry/3BP7BYG9PUGI8
"Llegará una época en la que una investigación diligente y prolongada sacará
a la luz cosas que hoy están ocultas" (Séneca, siglo I)

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Javier Chávez B. 2008-10-07 18:41:37 Re: ERROR: out of memory
Previous Message Javier Chávez B. 2008-10-07 18:07:08 Re: ERROR: out of memory