As tabelas são estas:<br>cadastros<br>=> tem o cadastro unico da pessoa em si. Nela tem a data de nascimento, nome, etc...<br>emails<br>=> tem os e-mails, relacionada com a cadastro, 1 ou mais e-mail por id_cadastro<br>
enderecos<br>=> tem os enderecos, mesma regra do email<br>telefones<br>=> tem os telefones, mesma regra do e-mail<br><br>Tabem temos uma tabela de log para cada uma dessas: cadastros_ids, emails_ids, enderecos_ids e telefones_ids.<br>
Quando um dedup é gerado (quando duas ou mais pessoas viram uma) é adiciona um log na cadastros_updated.<br><br>Quando duas pessoas ou mais viram uma, se faz:<br><br>Gera uma nova chave de id_cadastro,<br>pega todos os endereços/emails/telefone/data de nascimento do registro mais recente não nula e insere num novo cadastro.<br>
Na cadastros, tem o campo id_cadastros_pai,<br>ele, por padrão, é o proprio id_cadastros, quando ocorre um dedup, ele vira o id_cadastro do pai dele, pois precisamos saber quem virou quem.<br><br>Todas estas tabelas são alimentadas pela tabela tmp.tb_importa_contato_clean, <br>
Penso em separar esta tabela por arquivo recebido, pois já contém 8 milhoes nela, e só é necessário os registros do arquivo que esta sendo processado.<br><br>Então vamos la, fazer insert dos telefones novos.<br><br>SELECT <br>
nextval('telefones_id_telefone_seq') as id_telefone,<br><br> cad.id_cadastro,<br> icc.ident_id,<br> <a href="http://icc.id">icc.id</a>,<br> icc.id_origem,<br><br> icc.dm_areacode,<br> icc.dm_phone, -- tel_numero<br>
<br> icc.tel_compl,<br> icc.dm_matchphone,<br> icc.dm_phone, -- dm_phone<br> icc.dm_areacode <br>FROM <br> tmp.tb_importa_contato_clean icc<br>INNER JOIN cadastros cad ON (cad.id_feed = <a href="http://icc.id">icc.id</a> )<br>
LEFT JOIN telefones tel ON (tel.dm_matchphone = icc.dm_matchphone)<br> <br>WHERE <br> tel.id_telefone IS NULL<br>AND COALESCE(icc.dm_phone, '') != ''<br><br><br>Sim, é possivel.<br>Não sei se vai ser mais rápido, mas vou testar, afinal, como já me disseram, o banco tem indexe pra que?!<br>
<br>A query do insert de cadastros é a mais chata, pois vai ter que ter alguns OR, OR, OR...<br><br><br>Como sábado eu vou sair meio-dia, eu vou fazer os testes das queries durante a manhã, ok? ai deixo o perl pra depois.<br>
<br><br><br><div class="gmail_quote">2010/9/30 Frederico Recsky <span dir="ltr"><<a href="mailto:listas@imovlr.com">listas@imovlr.com</a>></span><br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
Olá,<br>
<div class="im"><br>
2010/9/29 Renato Santos <<a href="mailto:renato.cron@gmail.com">renato.cron@gmail.com</a>>:<br>
</div><div class="im">> Tem mais coisas<br>
> Sei q com esforco da pra virar 1 query. Mas vai ficar muito complexa.cheia<br>
> de replace, etc.<br>
<br>
</div>Banco de dados não é meu forte, mas você pode formatar uma query e<br>
deixar ela num nivel que fica bom de manter.<br>
<div class="im"><br>
insert into<br>
dedup (id, email, foo, bar)<br>
select<br>
min(id)<br>
, email<br>
, min(foo)<br>
, min(bar)<br>
from<br>
dup<br>
group by<br>
email<br>
<br>
</div>Mesmo se for um terrível replace, join, delete, alter table tudo junto<br>
fica razoável. Eu pessoalmente não domino nem um pouco SQL mas<br>
queries assim fica facil de entender.<br>
<br>
Ainda mais se voce pensar que essa query é um batch sequencial, vai<br>
funcionar como script.<br>
<br>
[]'s<br>
<font color="#888888"><br>
Frederico<br>
</font><div><div></div><div class="h5">_______________________________________________<br>
SaoPaulo-pm mailing list<br>
<a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>Renato Santos<br><a href="http://www.renatocron.com/blog/" target="_blank">http://www.renatocron.com/blog/</a><br>