Em uma rotina diária, preciso descartar e fazer uma carga em massa de um banco de dados.
O problema é que tenho uma WebApp contando com esse banco de dados. Portanto, não posso descartar o banco de dados assim.
Qual seria uma boa maneira de resolver esse problema?
Você precisa descartar e recarregar o banco de dados? Em um caso como o seu, eu procuraria uma maneira de sincronizar o banco de dados com o conjunto de referência (os dados que você está carregando).
Uma abordagem alternativa seria ter dois bancos de dados. Carregue um diferente a cada dia. Configure o aplicativo da web para que você possa trocar bancos de dados em tempo real.
Bem, isso é direto na maioria dos bancos de dados. Enquanto seu aplicativo está em execução, no trabalho de carregamento:
DELETE
todos os dados das tabelas ( não descartar ou truncar)INSERT
os novos dadosCOMMIT
a transaçãoEnquanto as etapas 1 a 3 estiverem em execução, o aplicativo verá a versão "antiga" dos dados e poderá continuar normalmente. Assim que a etapa 4 for concluída, o aplicativo verá os novos dados assim que executar a próxima consulta.
Trunque as tabelas e carregue os dados em massa. Se necessário, bloqueie o aplicativo da Web da tabela antes de truncar a tabela.
isso depende de como estão as árvores de dependência. Se você tiver muitos objetos dependentes na tabela [s] onde você carrega os dados, o melhor é não alterar o objeto, a tabela porque muitas invalidações ocorrerão.
truncar a tabela elimina os dados muito rapidamente, mas não funcionará quando houver restrições referenciais. Também não funcionará quando o aplicativo estiver em execução devido a problemas de bloqueio.
O melhor para o aplicativo será uma sequência normal de exclusão/inserção. Não é a opção mais rápida, mas é a melhor para disponibilidade e tem menos problemas com travamento.
Outras opções podem ser carregamento de troca de partição. As restrições podem ser problemáticas e levar muito tempo para serem validadas. Nunca derrube uma tabela apenas para se livrar dos dados. Uma tabela deve ser considerada como a infraestrutura do aplicativo e deve estar sempre disponível, pois o aplicativo lançará muitos erros para seus usuários.
carrego os novos dados em uma tabela temporária. desta forma, tenho que bloquear apenas as linhas que preciso atualizar. Depois, excluo as linhas ausentes e insiro novas linhas.
isso funciona pelo menos para postgresql.
para oracle eu uso o seguinte:
quando tenho valores impossíveis, posso usar NVL: