From: | Alvaro Herrera <alvherre(at)commandprompt(dot)com> |
---|---|
To: | Rafa Comino <rafacomino(at)gmail(dot)com> |
Cc: | pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | Re: Rendimiento de mi consulta |
Date: | 2007-03-02 13:53:27 |
Message-ID: | 20070302135327.GA4669@alvh.no-ip.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
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 | Alvaro Herrera | 2007-03-02 14:02:52 | Re: Novato en bases de datos... |
Previous Message | CArlos Tineo | 2007-03-02 13:16:48 | Re: RECORRER CAMPO TEXT |