Hola Helmith.

un caso parecido lo solucione con un procedimiento almacenado.

en la tabla debe crear 2 campos, una para marca si el registro ya fue
procesado y el otro campo una llave foránea a la misma tabla para marcar a
que registro se parce (registro padra).

en la función primero hace el select del alias "a" con un limite de 100 o
1000 de los registros no procesado, cada registro lo valida contra toda el
tabla de alias "b" y al final actualizo el registro como procesado y el id
del mas parecido, opcional puede guardar el grado de similitud.

esto hace que el problema no sea N*N ejecutado 1 vez, si no 1*N ejecutado N
veces.

el scrip lo ejecute en PHP y final de la ejecución recargaba las misma
pagina y procesaba otros 100 registros, ese navegador lo deje abierto como
2 días y al final termino, como todos los registros de la tabla se van a
actualizar es posible que el tamaño de la tabla se duplique y se debe
ejecutar al finalizar un vacuum full.

el problema yo lo solucione con FTS y cree una columma y su indice de tipo
tsvector, así calcule 1 sola ves el tsvector para toda la tabla y el
tsquery lo calcule en memoria un sola vez por cada registro del alias a.

-- 
Raul Andres Gutierrez Alejo



El 24 de abril de 2015, 9:16, Hellmuth Vargas <hiv...@gmail.com> escribió:

> hola Lista
>
> Tenemos una base con twitter y queremos  identificar aquellos que son
> copiados y pegados pero que vendrian a ser el mismo y no se identifican
> como retwitter...por ejemplo tenemos estos dos twitter
>
> Nueva alianza de @ConnectAmericas y @camaracomerbog a disposición de
> empresarios y empresas http://t.co/AQDeppDtso #Noticia
>
> RT @bidcomercio: Nueva alianza de @connectamericas y @camaracomerbog a
> disposición de empresarios y empresas http://t.co/f0Ky2564Lk #Noticia
>
> Ambos son en esencia igual y  por medio de la función de similaridad
> (similarity extension pg_trgm) identificamos que poseen una calificación
> 0.725, lo que nos permite concluir que son iguales en esencia. El problema
> surge cuando ya queremos comparar la tabla completa con  2'418.356
> registros aproximadamente (la partición de un mes), pues el join entre
> tablas seria la función de similaridad, la consulta que construí después de
> leer e investigar fue:
>
> SELECT set_limit(0.7);
>
> select a.texto,b.texto,similarity(a.texto,b.texto)
> from  particiontwitter.tweets_2015_01 as a
> join  particiontwitter.tweets_2015_01 as b on
> a.retweeted_status is NULL and LENGTH(a.texto) > 120
> and b.retweeted_status is NULL and LENGTH(b.texto) > 120
> and a.texto % b.texto
> and a.id<>b.id
>
> tengo los siguiente indices creados relevantes para la consulta:
>
> CREATE INDEX idx_tweets_trgm_2015_01 ON particiontwitter.tweets_2015_01
> USING gin (texto COLLATE pg_catalog."default" gin_trgm_ops);
> CREATE INDEX idx_tweets_trgm_gist_2015_01 ON
> particiontwitter.tweets_2015_01 USING gist  (texto COLLATE
> pg_catalog."default" gist_trgm_ops);
> CREATE INDEX idx_tweets_comp3_2015_01 ON particiontwitter.tweets_2015_01
> USING btree (retweeted_status COLLATE pg_catalog."default",
> length(texto::text));
>
> Y el plan de ejecución generado es:
>
> Nested Loop  (cost=487.15..485794.60 rows=38938 width=281)
>   ->  Bitmap Heap Scan on tweets_2015_01 a  (cost=487.06..14814.10
> rows=10808 width=148)
>         Recheck Cond: ((retweeted_status IS NULL) AND
> (length((text)::text) > 120))
>         ->  Bitmap Index Scan on idx_tweets_comp3_2015_01
> (cost=0.00..486.52 rows=10808 width=0)
>               Index Cond: ((retweeted_status IS NULL) AND
> (length((texto)::text) > 120))
>   ->  Index Scan using idx_tweets_trgm_gist_2015_01 on tweets_2015_01 b
> (cost=0.08..43.56 rows=4 width=133)
>         Index Cond: ((a.texto)::text % (texto)::text)
>         Filter: ((retweeted_status IS NULL) AND ((a.id)::text <>
> (id)::text) AND (length((texto)::text) > 120))
>
>
>
>  El problema es que no termina!!! lo he dejado correr un día y medio
> sobre  solo el mes de enero y no finalizo y supuestamente debemos correrlo
> para todo lo que va el 2015... he intentado con FTS pero tampoco
> funciono... como puedo hacer para optimizar  mejor y/o replantear la
> consulta o en general la manera de realizar la comparación  que me permita
> obtener resultados en un tiempo menor ? De antemano gracias!!!
>
> -
> Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org
> )
> Para cambiar tu suscripción:
> http://www.postgresql.org/mailpref/pgsql-es-ayuda
>
>

Responder a