Re: Busqueda de duplicados, con demora. SOLUCION

From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Gabriel Hermes Colina Zambra <hermeszambra(at)yahoo(dot)com>
Cc: Oswaldo Hernández <listas(at)soft-com(dot)es>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Busqueda de duplicados, con demora. SOLUCION
Date: 2007-06-05 14:31:48
Message-ID: 20070605143148.GD8140@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Gabriel Hermes Colina Zambra escribió:

> --- Alvaro Herrera <alvherre(at)commandprompt(dot)com>
> escribió:

> > explain
> > SELECT central.articulo_proveedor.id_articulo,
> > central.articulo_proveedor.id_proveedor,
> > central.articulo_proveedor.id_en_proveedor,
> > central.articulo_proveedor.dto1,
> > central.articulo_proveedor.dto2,
> > central.articulo_proveedor.unidades_x_envase,
> > central.articulo_proveedor.id_imagen INTO
> > dupartprov
> > FROM central.articulo_proveedor
> > WHERE central.articulo_proveedor.id_articulo In
> > (SELECT id_articulo FROM central.articulo_proveedor
> > As
> > Tmp GROUP BY id_articulo,id_proveedor HAVING
> > Count(*)>1)
> > ORDER BY id_articulo, id_proveedor;

Ahh, ya entiendo lo que pasa. La query que te pasé obtiene los
id_articulo de los registros que aparecen duplicados segun el par
(id_articulo, id_proveedor), y luego obtiene todos los articulos con
cada uno de esos id_articulo, ignorando el id_proveedor.

Prueba esto otro:

SELECT central.articulo_proveedor.id_articulo,
central.articulo_proveedor.id_proveedor,
central.articulo_proveedor.id_en_proveedor,
central.articulo_proveedor.dto1,
central.articulo_proveedor.dto2,
central.articulo_proveedor.unidades_x_envase,
central.articulo_proveedor.id_imagen
FROM central.articulo_proveedor
WHERE (central.articulo_proveedor.id_articulo, central.articulo_proveedor.id_proveedor) In
(SELECT id_articulo, id_proveedor
FROM central.articulo_proveedor As Tmp
GROUP BY id_articulo, id_proveedor
HAVING Count(*)>1)
ORDER BY id_articulo, id_proveedor;

Observa que el HAVING de la subconsulta es mas simple (no necesitar
poner la condicion que lo liga a la tabla de la consulta externa), pero
el IN compara ahora dos columnas, no solo una; y los resultados que
entrega deberian ser los duplicados que te interesan. (Observa que le
quite la clausula INTO para poder hacer pruebas mas comodamente).

La consulta se demora 100ms, con 8010 registros en la tabla (10 de los
cuales son duplicados)

Aca hice lo siguiente para experimentar:

create schema central;
create table central.articulo_proveedor (id_articulo int, id_proveedor int,
id_en_proveedor int, dto1 int, dto2 int, unidades_x_envase int,
id_imagen bytea);

insert into central.articulo_proveedor (id_articulo, id_proveedor)
select * from generate_series(1, 1000) a,
generate_series (1, 40) b
where a % 4 = b % 5 ;

insert into central.articulo_proveedor (id_articulo, id_proveedor)
select * from generate_series(1, 1000) a,
generate_series (1, 40) b
where a % 4 = b % 5 and a % 3 = b % 7 limit 10;

analyze central.articulo_proveedor ;

--
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 Jose Maria Mencia Fernandez 2007-06-05 15:34:34 Commit en PLPGSQL
Previous Message Alvaro Herrera 2007-06-05 14:05:07 Re: Fwd: sobre rowtype