Re: Rendimiento de mi consulta

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

In response to

Responses

Browse pgsql-es-ayuda by date

  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