From: | "Rafa Comino" <rafacomino(at)gmail(dot)com> |
---|---|
To: | "Rafa Comino" <rafacomino(at)gmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | Re: Rendimiento de mi consulta |
Date: | 2007-03-02 15:41:10 |
Message-ID: | bd8b58a40703020741s7e339da6oa188a2eed3f09b41@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
la consulta es parte de un INSERT
Gracias por vuestras aportaciones
On 3/2/07, Alvaro Herrera <alvherre(at)commandprompt(dot)com> wrote:
>
> Rafa Comino escribió:
> > Tengo la siguiente consulta:
> > SELECT DISTINCT isbn, CURRENT_TIMESTAMP, 1
> > FROM librosdisponibilidadtemp
> > WHERE proceso = ai_proceso
> > AND gen_isbn_pais(isbn) IN (SELECT pais FROM raizpaises)
> > AND NOT EXISTS
> > ( SELECT isbn
> > FROM libros
> > WHERE isbn = librosdisponibilidadtemp.isbn)
> > AND NOT EXISTS
> > ( SELECT isbn
> > FROM isbns_a_descubrir
> > WHERE isbn = librosdisponibilidadtemp.isbn);
>
> Ugh! Feo. Has intentado convertir esas cosas a LEFT JOINs? Creo que
> el optimizador no es muy brillante con los NOT EXISTS; en cambio los
> OUTER JOIN los podria procesar bastante mejor (particularmente en 8.2,
> que tiene una mejora significativa que permite reordenar los OUTER JOIN
> en una consulta; pero en versiones anteriores uno diria que de todas
> formas deberia ir mejor que el plan que tu muestras). Creo que tendria
> que ser algo como
>
> select distinct isbn
> from librosdisponibilidadtemp
> left join libros on (libros.isbn = librosdisponibilidadtemp.isbn)
> left join isbns_a_descubrir on (isbns_a_descubrir.isbn =
> librosdisponibilidadtemp.isbn)
> where proceso = ai_proceso and
> gen_isbn_pais(isbn) in (select pais from raizpaises) and
> libros.isbn is null and
> isbns_a_descubrir.isbn is null;
>
>
> Prueba con eso; si no funciona, modifica hasta que funcione ;-) Espero
> que se entienda la idea de lo que trata de hacer la consulta de arriba.
>
> Una cosa que me llama la atencion de tu consulta es que devuelves el
> current_timestamp, cosa que obviamente es bastante inutil que se
> devuelva para cada registro, y ademas un 1 constante. Sospecharia que
> esta consulta es parte de un UNION o algo asi ...?
>
>
> Ah, otra mejora que quizas se le podria hacer seria cambiar el DISTINCT
> por un GROUP BY,
>
> select isbn
> from librosdisponibilidadtemp
> left join libros on (libros.isbn = librosdisponibilidadtemp.isbn)
> left join isbns_a_descubrir on (isbns_a_descubrir.isbn =
> librosdisponibilidadtemp.isbn)
> where proceso = ai_proceso and
> gen_isbn_pais(isbn) in (select pais from raizpaises) and
> libros.isbn is null and
> isbns_a_descubrir.isbn is null
> group by isbn;
>
> --
> Alvaro Herrera
> http://www.CommandPrompt.com/
> PostgreSQL Replication, Consulting, Custom Development, 24x7 support
>
From | Date | Subject | |
---|---|---|---|
Next Message | Espartano | 2007-03-02 15:52:20 | Re: no puedo parar servicio postgresql |
Previous Message | Leonel Nunez | 2007-03-02 15:21:41 | Re: validacion de usuarios |