Skip site navigation (1) Skip section navigation (2)

Re: Consulta Eficiente

From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Rafa Comino <rafacomino(at)gmail(dot)com>
Cc: postgres Emanuel CALVO FRANCO <postgres(dot)arg(at)gmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta Eficiente
Date: 2008-10-17 14:52:55
Message-ID: 20081017145255.GF4218@alvh.no-ip.org (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
Rafa Comino escribió:

>      curpet CURSOR (fechaI DATE, fechaF DATE) FOR
>             SELECT isbn, identidad, idpeticion, fechapeticion
>               FROM peticiones
>              WHERE fechapeticion >= fechaI
>                AND fechapeticion <= fechaF
>                AND tipopeticion = 'PC'
>                AND completa = true
>              ORDER BY fechapeticion;

>      OPEN curpet(ldt_fini, ldt_ffin);
>      -- Saco el primer registro
>      FETCH curpet INTO lr_pet;
>      WHILE FOUND LOOP
>            IF ((SELECT COUNT(*) FROM log_peticiones WHERE isbn = lr_pet.isbn
> AND identidad = lr_pet.identidad AND tipopeticion='PC' AND fechapeticion >=
> ldt_fechanocobrar) > 0) THEN
>               DELETE FROM peticiones WHERE idpeticion = lr_pet.idpeticion;

Hmm, esto debe ser lento como inyección de ulpo.

Creo que está mal planteada la forma de hacer esto.  En lugar de ir una
por una con el cursor viendo el COUNT() de la otra tabla, deberías
reformular esto usando un EXISTS.  Algo así como

delete from peticiones
 where exists (select 1
                 from log_peticiones
	        where peticiones.identidad = identidad
		  and tipopeticion = 'PC'
		  and fechapeticion >= ldt_fechanocobrar)


>               -- Elimino las peticiones repetidas mayores que la petición
> que estoy revisando
>               DELETE FROM peticiones
>                WHERE isbn = lr_pet.isbn
>                  AND identidad = lr_pet.identidad
>                  AND tipopeticion='PC'
>                  AND fechapeticion >= ldt_fini
>                  AND fechapeticion <= ldt_ffin
>                  AND fechapeticion > lr_pet.fechapeticion;
>            END IF;

Acá algo semejante, creo.

-- 
Alvaro Herrera                         http://www.flickr.com/photos/alvherre/
Renaming ReiserFS to NinaFS is such an amazingly stupid suggestion, in so many
ways, that it ought to qualify for some kind of award.  Or perhaps we should
name an award after it: the "NinaFS award" for outstanding crassness.
                                    (edmundo, http://lwn.net/Articles/203846/)

In response to

pgsql-es-ayuda by date

Next:From: Alvaro HerreraDate: 2008-10-17 15:01:36
Subject: Re: existen stored procedures?
Previous:From: Alvaro HerreraDate: 2008-10-17 14:46:31
Subject: Re: Consulta Eficiente

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group