› Fóruns › SQL e PL/SQL › Duvida uso do Bulk Collect e estouro de memoria ORA-04030 › Duvida uso do Bulk Collect e estouro de memoria ORA-04030
Manoel,
Obrigada pela sugestão!
Acho até que funcionará sim se fizermos o cursor executar mais de uma vez, com um loop externo e uma quebra por hora ou outra.
A questão é que se estou com um bulk collect alocando somente de 5000 em 5000 registros, se eu reduzir a query filtrando de hora em hora ou qualquer outro tipo de quebra, será que resolverá? Na prática acho que sim, mas não entendo porque deveria haver diferença se estou usando limite. 🙂
Teoricamente: O limite do cursor não deveria ser suficiente? Se não tiver memória para o limite de 5000, terá memória para um cursor que traga menos registros, mesmo ocupando o mesmo limite de 5000?
Se filtrar por hora, teremos pelo menos 48 execuções, com média de 32.000 registros em cada (se os registros fossem distribuídos de forma igual através do dia, mas infelizmente não são, os eventos são criados em massa para varias lojas ao mesmo tempo).
Outra possibilidade que quase implantamos foi realizar a query uma vez para cada cod_loja, mas não foi possível, porque meu gerente achou que degradaria a performance, executar a query 300 vezes, filtrando uma loja por vez, então implantamos a melhoria somente incluindo o bulk collect, removendo o union (essa query, na primeira versão sem o bulk era executada toda de uma só vez) e removendo um order by por 5 campos que estava sendo realizado.
Essa quebra por loja é minha próxima tentativa mapeada, mas mais para “gambearra” rs, do que solução que me orgulharia, pois até então não consegui entender o motivo do bulk collect não estar restringindo o uso da memória da forma como eu imaginei que faria.
[b]
Outra coisa importante[/b] que esqueci de citar anteriormente: a mesma query, executada diretamente no PLSQL Developer funcionou sem causar o estouro de memória.
Dúvida: será a forma de implementação da rotina que está fazendo com que o bulk collect não funcione corretamente? Ou sobrecarregando a memória de forma diferente da execução da query fora da rotina? Tem alguma forma diferente que eu poderia aplicar o bulk collect?