[SP-pm] Tempo (grande!) de liberação de memoria no perl
Renato Santos
renato.cron at gmail.com
Thu Sep 30 05:16:26 PDT 2010
As tabelas são estas:
cadastros
=> tem o cadastro unico da pessoa em si. Nela tem a data de nascimento,
nome, etc...
emails
=> tem os e-mails, relacionada com a cadastro, 1 ou mais e-mail por
id_cadastro
enderecos
=> tem os enderecos, mesma regra do email
telefones
=> tem os telefones, mesma regra do e-mail
Tabem temos uma tabela de log para cada uma dessas: cadastros_ids,
emails_ids, enderecos_ids e telefones_ids.
Quando um dedup é gerado (quando duas ou mais pessoas viram uma) é adiciona
um log na cadastros_updated.
Quando duas pessoas ou mais viram uma, se faz:
Gera uma nova chave de id_cadastro,
pega todos os endereços/emails/telefone/data de nascimento do registro mais
recente não nula e insere num novo cadastro.
Na cadastros, tem o campo id_cadastros_pai,
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.
Todas estas tabelas são alimentadas pela tabela
tmp.tb_importa_contato_clean,
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.
Então vamos la, fazer insert dos telefones novos.
SELECT
nextval('telefones_id_telefone_seq') as id_telefone,
cad.id_cadastro,
icc.ident_id,
icc.id,
icc.id_origem,
icc.dm_areacode,
icc.dm_phone, -- tel_numero
icc.tel_compl,
icc.dm_matchphone,
icc.dm_phone, -- dm_phone
icc.dm_areacode
FROM
tmp.tb_importa_contato_clean icc
INNER JOIN cadastros cad ON (cad.id_feed = icc.id )
LEFT JOIN telefones tel ON (tel.dm_matchphone = icc.dm_matchphone)
WHERE
tel.id_telefone IS NULL
AND COALESCE(icc.dm_phone, '') != ''
Sim, é possivel.
Não sei se vai ser mais rápido, mas vou testar, afinal, como já me disseram,
o banco tem indexe pra que?!
A query do insert de cadastros é a mais chata, pois vai ter que ter alguns
OR, OR, OR...
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.
2010/9/30 Frederico Recsky <listas at imovlr.com>
> Olá,
>
> 2010/9/29 Renato Santos <renato.cron at gmail.com>:
> > Tem mais coisas
> > Sei q com esforco da pra virar 1 query. Mas vai ficar muito
> complexa.cheia
> > de replace, etc.
>
> Banco de dados não é meu forte, mas você pode formatar uma query e
> deixar ela num nivel que fica bom de manter.
>
> insert into
> dedup (id, email, foo, bar)
> select
> min(id)
> , email
> , min(foo)
> , min(bar)
> from
> dup
> group by
> email
>
> Mesmo se for um terrível replace, join, delete, alter table tudo junto
> fica razoável. Eu pessoalmente não domino nem um pouco SQL mas
> queries assim fica facil de entender.
>
> Ainda mais se voce pensar que essa query é um batch sequencial, vai
> funcionar como script.
>
> []'s
>
> Frederico
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm at pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>
--
Renato Santos
http://www.renatocron.com/blog/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20100930/19d843de/attachment-0001.html>
More information about the SaoPaulo-pm
mailing list