Venho pedir aqui a ajuda do pessoal na seguinte necessidade. Temos uma funcionalidade no sistema que permite cruzamento de dados e que gera querys dinâmicas no banco, para gerar seleções de dados. Estas seleções são utilizadas em sistemas de terceiros e muitas vezes são exportadas a partir do nosso sistema. Estas seleções podem chegar a gerar números absurdos como 500 mil registros. Os registros são exibidos para seleção do usuário (pois tem casos que o usuário precisa de registros especificos) antes das exportações (que podem ser através de csv ou relatórios jasper).
O problema que encontramos é que como as seleções são muito dinâmicas as vezes demoram minutos para executar no banco de dados. Esta espera em um primeiro momento não é problema, porém como os dados devem ser paginados para exibir na tela, esta consulta demorar a cada paginação acaba sendo um problema.
Os sistemas antigos da empresa utilizavam a técnica de rodar estes selects dentro de uma tabela “fisica temporária” (realizando uma especia de SELECT INTO tb_tmp_nomedousuario) e depois trabalhavam com essa tabela, pois os dados já estavam prontos.
O problema desta primeira solução é que gera muito lixo no banco de dados, causando perda de performance e até mesmo aconteceu de acabar com o espaço em disco no servidor.
Na nova solução, a alternativa foi gravar esta consulta serializada na máquina do usuário e navegar nos objetos serializados. Como o sistema é desktop, ao realizar a consulta mostra-se uma barra de progresso fazendo o usuário aguardar e grava os dados prontos serializando os objetos em um arquivo temporário da máquina. Salve-se outro objeto com as referências para cada objeto. Utiliza-se o RandomAccessFile juntamente do seek nestas referências para fazer a paginação. Ao realizar uma nova consulta apaga-se o arquivo temporário anterior. Cada consulta destas de 500 mil registros consome em torno de 200MB da estação de trabalho, porém o consumo de memória é baixissimo e após realizar a primeira consulta, não é preciso voltar ao banco de dados para cada nova paginação.
Esta funcionando bem, mas gostaria de saber opniões das pessoas a respeito da primeira solução que foi adotada no sistema antigo. Desta nova solução. Os prós e contras. Se conseguem enxergar riscos no processo implementado desta forma. E o principal: Se existe outra alternativa.
Obrigado