Para resumir os detalhes: Precisamos colocar aproximadamente 5 milhões de linhas em um banco de dados do fornecedor (Oracle). Tudo corre bem para lotes de 500 mil linhas usando OracleBulkCopy
(ODP.NET), mas quando tentamos escalar até 5 milhões, o desempenho começa a desacelerar depois que atinge a marca de 1 milhão, fica progressivamente mais lento à medida que mais linhas são carregadas e, eventualmente, expira após 3 horas ou mais.
Eu suspeito que esteja relacionado a uma chave primária na mesa, mas tenho procurado nos fóruns da Oracle e no Stack Overflow para obter informações e muito do que estou lendo contradiz isso (também, muitas postagens parecem contradizer uma à outra ) . Espero que alguém possa esclarecer algumas questões relacionadas ao processo:
A
OracleBulkCopy
classe usa carregamento convencional ou de caminho direto? Existe alguma maneira de confirmar isso, de uma maneira ou de outra?Supondo que ele use carregamento de caminho direto: é verdade que o Oracle define automaticamente todos os índices como inutilizáveis durante o carregamento e os coloca novamente online depois? Eu li várias declarações para esse efeito, mas, novamente, não posso confirmá-lo.
Se o número 2 for verdadeiro, deve fazer alguma diferença quais índices estão na tabela antes de iniciar uma operação de cópia em massa? Se sim, por quê?
Em relação ao item 3, existe alguma diferença prática, em geral, entre o carregamento em massa com um índice inutilizável e, na verdade, descartar o índice antes do carregamento e recriá-lo posteriormente?
Se o item 2 não estiver correto, ou se houver algumas ressalvas que não estou entendendo, faria alguma diferença explicitamente tornar o índice inutilizável antes do carregamento em massa e depois reconstruí-lo explicitamente depois?
Há mais alguma coisa, além da criação de índices, que poderia fazer com que uma operação de cópia em massa cresça progressivamente mais lenta à medida que mais e mais registros são adicionados? (Talvez algo a ver com o log, embora eu espere que operações em massa não sejam registradas?)
Se realmente não houver outra maneira de melhorar o desempenho, além de eliminar o PK / índice primeiro, que etapas posso seguir para garantir que o índice não desapareça completamente, ou seja, se a conexão com o banco de dados for perdida? no meio do processo?