[SP-pm] Comparando grande massa de dados

Andre Carneiro andregarciacarneiro at gmail.com
Thu May 20 14:55:09 PDT 2010


Humm...

Nesse caso, penso que seja melhor unificar os formatos, ou seja, ou você
joga tudo para um banco só em tabelas temporárias(isso não parece ser
interessante pra você), ou você padroniza tudo num formato. Qual??? Aí é com
você! CSV é bem simples, e dá pra vc tratar com SQL através do módulo
DBD::CSV. Mas dá pra fazer isso com vários formatos na verdade, até com
XML(não sei se isso é interessante pra vc).

Tratar tudo no diff eu acho arriscado, mas nada que um 'pente fino' não
resolva. Fica bem rápido, mas a checagem e manutenção disso deve ficar bem
difícil.


Cheers!




2010/5/20 Guarnieri, Carlos [ICG-IT] <carlos.guarnieri at citi.com>

>  i got it... mas believe nao eh  soh oraco; tem um sybase vagabundo e um
> db2 e o arquivo texto tem cerca de 2,5 gigas... :'(
>
>  ------------------------------
> *From:* saopaulo-pm-bounces+carlos.guarnieri=citi.com at pm.org [mailto:
> saopaulo-pm-bounces+carlos.guarnieri<saopaulo-pm-bounces%2Bcarlos.guarnieri>
> =citi.com at pm.org] *On Behalf Of *Andre Carneiro
> *Sent:* quinta-feira, 20 de maio de 2010 15:50
>
> *To:* saopaulo-pm at mail.pm.org
> *Subject:* Re: [SP-pm] Comparando grande massa de dados
>
> Tenho quase certeza que o teu hash não vai trabalhar mais rápido que o
> índice do Oracle. Acho bem difícil.
>
> Você não vai ter segmento de UNDO e REDO, porque você estaria carregando
> com sqlldr. Não tem volta!!!! ;) Esse é um dos motivos dele ser rápido!!!!
>
> Você pode perder desempenho se os índices não estiverem ok! Nesse caso vc
> deve regerá-los. Mas isso seria apenas no momento de execução teu SELECT .
>
> Eu tô sugerindo essas coisas, porque trabalhar diretamente com os dados,
> embora bom para o aprendizedo, aumenta as chances de erros. Se vc está
> trabalhando no ambiente do RDBMS, pelo menos alguns erros(principalmente no
> que se refere a referências), são mais facilmente detectáveis através da
> interface com o banco de dados.
>
> Mas se você prefere fazer 'no braço', não tem problema também. Você pode
> usar o módulo do CVS que eu sugeri, você pode usar diff(ordenando as
> pesquisas nos dois bancos de dados, vc consegue capturar as diferenças).
>
> diff -Bub arq_Oracle.dat arq_Sybase.dat >dedoduro.txt
>
> Enfim, várias soluções possíveis. Se eu conseguir lembrar de mais alguma
> coisa eu posto .
>
>
> Cheers!
>
>
>
>
> 2010/5/20 Guarnieri, Carlos [ICG-IT] <carlos.guarnieri at citi.com>
>
>>  Hallo,
>>     O Otavio pegou a ideia. Eh exatamente isso que quero fazer comparar os
>> hashes (e apenas inserir as PKS e hashes no banco) porque... na verdade
>> tenho que comparar um arquivo txt (que vem de mainframe) com os bancos de
>> dados. Os dois usam UTF-8 porque temos enderecos russos em cirilico e em
>> outras formatos estranhos :p
>>
>> Nao quero jogar os dados todos no banco porque quero um processo rapido e
>> nao quero correr o risco de exaurir a temp do banco ou segmento de rollback.
>>
>> Talvez o melhor seja retirar as coisas do banco e gerar os hashes em
>> arquivos temporarios...
>>
>> Nao temos timing para comprar ferramenta especifica pra isso (e eu acho tb
>> q nao compensa) e o processo tem de rodar toda semana e/ou sob demanda
>> porque contem informacoes criticas de cliente (que soh podem ficar em area
>> militarizada).
>>
>> Valew pelas dicas.  Vou acabar comparando em arquivos locais mesmo. O
>> servidor de processo eh bem parrudo
>>
>>  ------------------------------
>>  *From:* saopaulo-pm-bounces+carlos.guarnieri=citi.com at pm.org [mailto:
>> saopaulo-pm-bounces+carlos.guarnieri<saopaulo-pm-bounces%2Bcarlos.guarnieri>
>> =citi.com at pm.org] *On Behalf Of *Andre Carneiro
>> *Sent:* quinta-feira, 20 de maio de 2010 14:20
>>
>> *To:* saopaulo-pm at mail.pm.org
>> *Subject:* Re: [SP-pm] Comparando grande massa de dados
>>
>>   2010/5/20 Otavio Pereira <otavio.pereira at gmail.com>
>>
>>> Na verdade, eu acho que entendi.
>>>
>>> Ele tem pks identicas nos dois bancos, então ele quer tratar o registro
>>> inteiro (50+ colunas) como uma string e gerar um hash disso e então comparar
>>> com os hashes obtidos no outro banco. Onde os hashs não baterem, levantará
>>> um flag (a tabela dedo-duro que ele comentou) para averiguação.
>>>
>>>
>> Eu entendi mais ou menos isso... rsrs!!! Mesmo assim não vejo porque
>> salvar em arquivos. Mas se são as mesmas PKs, porque não salvar uma tabela
>> temporária no banco que será sincronizado e utilizar essa tabela mesmo para
>> fazer a comparação??
>>
>>
>>> Se for isso, o único problema que vejo é qto aos charsets dos bancos e
>>> caracteres extras que eles possam inserir (tipo fazer padding a direita com
>>> espaços ou 0x0), sei lá.
>>>
>>>
>> Já eu sinceramente espero que os dois bancos estejam em UTF-8. Se não
>> estiver, terás que usar Encode para converter os dados antes de comparar, e
>> provalemente, tabelas de conversão de caracteres.
>>
>> Não sei se vai ser uma boa idéia carregar hashes tão grandes na memória.
>> Pode-se salvar tudo em CSV  e usar DBD::CSV para comparar, por exemplo.
>>
>>
>>
>>> Já tentei fazer isso com um banco de dados médico pra tentar diferenciar
>>> homônimos, funcionou mais ou menos... mas é que tinha muitos José Silvas e
>>> Marias Severinas no banco rs.
>>>
>>> Espero que tenha entendido certo!
>>>
>>>
>> Entendi sim, valeu!
>>
>>
>>> []
>>> Otávio
>>>
>>>
>>> 2010/5/20 Andre Carneiro <andregarciacarneiro at gmail.com>
>>>
>>> Nossa! Q confusão!
>>>>
>>>> Deixa eu ver se entendi:
>>>>
>>>> 1) Você quer sincronizar uma base Oracle com uma Sybase(vice-versa???);
>>>> 2) Se vc já vai carregar coisas com o sqlldr numa tabela temporária, já
>>>> na base de produção, pra que vc precisa de hashes??? Não entendi. Se os
>>>> dados já estão lá, compara com a tabela em produção diretamente com SQL,
>>>> procedures etc...(se eu estiver falando besteira, pode me xingar);
>>>> 3)Você já pensou em utilizar alguma ferramenta de migração de dados ? Se
>>>> isso é crítico no seu trabalho, talvez(só uma sugestão) uma solução pronta
>>>> possa resolver de maneira mais efetiva( não sei se resolve, mas vi essa
>>>> aqui:
>>>> http://www.swissql.com/products/oracle-to-sybase/oracle-to-sybase.html);
>>>>
>>>>
>>>> Cheers!
>>>>
>>>>
>>>>
>>>> 2010/5/20 Guarnieri, Carlos [ICG-IT] <carlos.guarnieri at citi.com>
>>>>
>>>>  o problema eh q teria de lidar com o sqldr (oracle) e o bcpin
>>>>> (sybase). Nao posso usar base de teste; apenas prod 2 prod. Os arquivos vem
>>>>> de mainframe. Preciso comparar conteudo de campos para garantir que estejam
>>>>> em sincronia (nao.. nao tem um lastUpdateDate....) Sao dados sensiveis de
>>>>> companhias que tem permissao do FED para transferir certas quantias...
>>>>>
>>>>> Aqui esta uma ideia:
>>>>>
>>>>>     1) pego o arquivo e usando a PK dele (um codigo unico e
>>>>> obrigatorio, global da empresa no FED) gero um hash pros campos que quero
>>>>> comparar
>>>>>         carrego esse arquivo no dbms  que quero fazer comparacao
>>>>> (usando sqldr / bcpin) - talvez de 300 em 300 mil
>>>>>         (hj o cadastro eh mais de 1 milhao mas continua crescendo. nao
>>>>> posso correr o risco de enche a temp do banco)
>>>>>     1.1) pros IDS carregados gero em outra tabela temporaria os hashes
>>>>> dos registros que ja estavam no dbms e comparo os hashes.
>>>>>     1.2) Os IDS que tem hashes separados vao pra minha tabela dedo
>>>>> duro dos registros fora de sync.
>>>>>     1.3) limpa a tabela dos hashes e repete 1.1 e 1.2 ateh o final do
>>>>> arquivo
>>>>>     1.4) manda os arquivos fora de sync pro mainframe, apaga as temp,
>>>>>     1.5) cd /pub; more beer;  while(true) do; sleep; done
>>>>>
>>>>> razoavel?
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>  ------------------------------
>>>>>  *From:* saopaulo-pm-bounces+carlos.guarnieri=citi.com at pm.org [mailto:
>>>>> saopaulo-pm-bounces+carlos.guarnieri<saopaulo-pm-bounces%2Bcarlos.guarnieri>
>>>>> =citi.com at pm.org] *On Behalf Of *Andre Carneiro
>>>>> *Sent:* quinta-feira, 20 de maio de 2010 08:41
>>>>>
>>>>> *To:* saopaulo-pm at mail.pm.org
>>>>> *Subject:* Re: [SP-pm] Comparando grande massa de dados
>>>>>
>>>>>   Existe o sqlldr para Oracle(mas você já sabia disso :D). Ele serve
>>>>> exatamente para carregar grandes quantidades de dados rapidamente.
>>>>>
>>>>> Existem alguns módulos para manipular e executar cargas de dados no
>>>>> CPAN, utilizando o SQLLoader. O que eu achei mais simples foi esse aqui:
>>>>>
>>>>>
>>>>> http://search.cpan.org/~ezra/Oracle-SQLLoader-0.9/lib/Oracle/SQLLoader.pm<http://search.cpan.org/%7Eezra/Oracle-SQLLoader-0.9/lib/Oracle/SQLLoader.pm>
>>>>>
>>>>> O problema é que não é atualizado desde 2006!!!
>>>>>
>>>>>
>>>>>
>>>>> 2010/5/19 Guarnieri, Carlos [ICG-IT] <carlos.guarnieri at citi.com>
>>>>>
>>>>>>  entao... sao oracle e sybase... mas como os arquivos sao grandes to
>>>>>> com medo de joga pro banco.
>>>>>>
>>>>>
>>>>> Deixe disso! Faça muitos testes em tabelas temporárias(se possível em
>>>>> uma base de testes), e seja feliz!
>>>>>
>>>>>
>>>>>> Tava pensando mais em pegar os dados e comparar no unix...
>>>>>>
>>>>>>
>>>>>
>>>>> Que tipo de comparação?
>>>>>
>>>>>
>>>>>
>>>>>>  o q acham?
>>>>>>
>>>>>
>>>>> Não sei, mais detalhes por favor(se possível)!!!
>>>>>
>>>>>
>>>>>
>>>>>>
>>>>>>  ------------------------------
>>>>>> *From:* saopaulo-pm-bounces+carlos.guarnieri=citi.com at pm.org [mailto:
>>>>>> saopaulo-pm-bounces+carlos.guarnieri<saopaulo-pm-bounces%2Bcarlos.guarnieri>
>>>>>> =citi.com at pm.org] *On Behalf Of *Andre Carneiro
>>>>>> *Sent:* quarta-feira, 19 de maio de 2010 18:09
>>>>>> *To:* saopaulo-pm at mail.pm.org
>>>>>> *Subject:* Re: [SP-pm] Comparando grande massa de dados
>>>>>>
>>>>>>
>>>>>>
>>>>>> Em 19 de maio de 2010 17:39, Guarnieri, Carlos [ICG-IT] <
>>>>>> carlos.guarnieri at citi.com> escreveu:
>>>>>>
>>>>>>> Pessoal,
>>>>>>> Preciso fazer a reconciliacao de um banco de dados. Essa
>>>>>>> reconciliacao tera de rodar automatica todo final de semana para garantir
>>>>>>> que alguns sistemas estejam em sync. Não temos poder sobre o formato do
>>>>>>> arquivo que vamos receber, mas terei de comparar com algumas tabelas em
>>>>>>> nosso banco de dados.
>>>>>>>
>>>>>>> Enfim temos umas 50 colunas (algumas de endereco [char 64] / mas a
>>>>>>> maioria char 20]) e mais de 1 milhao de registros. Entao não quero fazer um
>>>>>>> sqlload em nosso banco para comparar via banco.
>>>>>>> Alguem tem alguma sugestao interessante de como comparar esses dados?
>>>>>>> Criar tabela de espalhamento e testar um contra outro, exportar o banco no
>>>>>>> mesmo formato do arquivo e fazer diff no unix (:d)...
>>>>>>>
>>>>>>> Sugestoes são bem vindas.
>>>>>>>
>>>>>>>
>>>>>> Certo!
>>>>>>
>>>>>> 1) qual RDBMS você está usando (Postgres, Oracle, SQLServer, MySQL) ?;
>>>>>>
>>>>>> 2) Você mencionou sqlload. Então eu suponho que vc vai ter que
>>>>>> transformar os dados no formato que o sqlload aceita. Se for isso, você pode
>>>>>> usar templates, por exemplo. Um template para cada arquivo recebido com
>>>>>> formato específico, e alguns módulos que receberão os dados e usarão os
>>>>>> templates para formatá-los corretamente;
>>>>>>
>>>>>> 3) Exitem módulos para você trabalhar com o sqlload no CPAN. Sugiro
>>>>>> que você dê uma procurada e posta o RDBMS que vc está usando para que nós
>>>>>> possamos sugerir algum módulo para você;
>>>>>>
>>>>>>
>>>>>>
>>>>>> Cheers!
>>>>>>
>>>>>>
>>>>>>>
>>>>>>> Valew
>>>>>>> _______________________________________________
>>>>>>> SaoPaulo-pm mailing list
>>>>>>> SaoPaulo-pm at pm.org
>>>>>>> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> André Garcia Carneiro
>>>>>> Analista/Desenvolvedor Perl
>>>>>> (11)82907780
>>>>>>
>>>>>> _______________________________________________
>>>>>> SaoPaulo-pm mailing list
>>>>>> SaoPaulo-pm at pm.org
>>>>>> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> André Garcia Carneiro
>>>>> Analista/Desenvolvedor Perl
>>>>> (11)82907780
>>>>>
>>>>> _______________________________________________
>>>>> SaoPaulo-pm mailing list
>>>>> SaoPaulo-pm at pm.org
>>>>> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> André Garcia Carneiro
>>>> Analista/Desenvolvedor Perl
>>>> (11)82907780
>>>>
>>>> _______________________________________________
>>>> SaoPaulo-pm mailing list
>>>> SaoPaulo-pm at pm.org
>>>> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>>>>
>>>
>>>
>>> _______________________________________________
>>> SaoPaulo-pm mailing list
>>> SaoPaulo-pm at pm.org
>>> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>>>
>>
>>
>>
>> --
>> André Garcia Carneiro
>> Analista/Desenvolvedor Perl
>> (11)82907780
>>
>> _______________________________________________
>> SaoPaulo-pm mailing list
>> SaoPaulo-pm at pm.org
>> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>>
>
>
>
> --
> André Garcia Carneiro
> Analista/Desenvolvedor Perl
> (11)82907780
>
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm at pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>



-- 
André Garcia Carneiro
Analista/Desenvolvedor Perl
(11)82907780
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20100520/34d09eb1/attachment-0001.html>


More information about the SaoPaulo-pm mailing list