Olá pessoal, como estão!?
Como eu gosto de ler sobre assuntos que envolvem performance, seja no banco ou ETL, estive pesquisando e lendo sobre na internet e livros e resolvi criar esse post de dicas rápidas.
São dicas simples e práticas que podem ser implementadas de forma fácil quando estiver desenvolvendo seu processo de tratamento de dados e que, garantirá uma entrega mais rápida reduzindo a chance de bottlenecks durante o caminho.
Outro ponto positivo é que nenhuma envolve código ou transformações complexas, apenas indicam uma alteração na maneira como estamos acostumados a trabalhar. Então, sem mais demoras, vamos ver quais são.
- Isole e execute a extração dos dados – em um post recente sobre como extrair dados de um banco utilizando uma batch com um comando SQL(aqui e aqui), indiquei que seria melhor isolar os processo e evitar acesso direto ao banco. Como acesso direto ao banco gera concorrência e pode levar a lentidão, utilize este recurso para extrair os dados, salvar em txt ou csv e trabalhar com fontes oriundas de arquivos. Isso garante maior agilidade ao certame,evitando burocracias quanto à acesso ao banco com suas permissões e reduz a quantidade de leitura e escrita dos dados do banco na memória ou disco.
- Reduza a quantidade de filtros – bem, ferramenta de ETL não é banco de dados que adora uma coluna na cláusula where, geralmente filtros tornam o processo um pouco mais lento, então, evite ou se não for possível, reduza a quantidade. Realizar um teste e veja se ele causa impacto ou não e caso não, sem problemas; mas o ideal é evitar.
- Não exagere nos Lookups – sabemos que o uso dos lookups são importantíssimos e garante a boa consistência do DW, mas, durante a stream de dados eles são bons consumidores de recursos de hardware, principalmente memória. Utilize quando for necessário ou em transformações menores, garantindo uma execução mais rápida. E não esqueça de limitar a quantidade de linhas que o lookup irá bufferizar no cache de memória, acredite, ele pode consumir tudo.
- Ordenamentos e agregações – assim como no banco de dados, ordenamento e agregações costumam pesar na transformação e pelo mesmo motivo do lookup: carregam linhas na memória. Como todo o ETL ocorre em memória, pode faltar para outros processos. Use-os com parcimônia e, se possível, sempre ao final.
- Analisar o desempenho de cada transformação de forma isolada – a ideia por detrás deste procedimento é entender todo o processo e tentar identificar se em alguma transformação há um consumo maior do que o esperado de recursos e como podemos melhorar. Às vezes, uma simples conversão pode atrapalhar seu processo.
- Cuidado com updates – verifique se durante seu ETL houve muito update, ou, se os dados das fontes estão atualizando com muita frequência. No caso do segundo, pode ser que seja melhor aumentar o espaço entre as cargas para ter um loto definitivo que não utilizará muito desta tarefa. Updates são problemáticos em qualquer ambiente, cuidado.
- Testes – ainda que eu tenha afirmado que trabalhar com fontes em arquivos txt soa mais rápido, faça testes! Pode ser que extrair direto do banco garanta maior velocidade do que a primeira opção. Somente tenha cuidado com os I/O. Dependendo do tipo de disco, caso seja on-premisses, pode ser que não haja melhora; daí é melhor o txt ou csv mesmo.
- Particionar e paralelizar – se a sua carga envolve uma tabela fato com milhões ou bilhões de linhas, considere com muita boa vontade particionar essa carga por períodos. Caso não seja possível, verifique se a sua ferramenta de ETL permite paralelização de processos para aumentar o ganho na performance e carrega mais rápido. É uma boa estratégia para esses grandes volumes.
- Bulk-load – é fato que inserts que são minimamente logáveis costumam ser mais rápidos de serem executados. Por isso, garanta que seu banco esteja com esse modo de recuperação caso não haja uma tarefa específica de bulk-load para o banco que esteja utilizando.
- Desativar index e constraints – recursos que são ótimos apenas para consultas. O engine do banco tem grande dificuldade em ordenar dados antes de inserir, caso estejam habilitados, isso causa um grande consumo de recursos acarretando lentidão. Evite sempre.
- Deixe que o ETL faça o seu serviço – “Ao banco o que é do banco, ao ETL o que é do ETL. “ Deixe que todo o processo de tratamento e conformidade ocorra em software específico e que o banco de dados fique responsável apenas com a parte de gravar no local correto.
Estas foram algumas das dicas que achei mais interessantes e que podem agregar no conhecimento e prática diária.
Claro que nem todas se aplicam e que é imprescindível que cada caso seja analisado de forma correta, mas, quis trazer uma visão geral de como as transformações podem obter um resultado melhor e como se pautar para garantir isso.
Procure realizar exaustivos testes e verifique o que se aplica e não se aplica ao ambiente!
Espero que gostem, deus os abençoe!
Saúde.