[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