sql >> Base de Datos >  >> RDS >> Mysql

Uso de ScrollableResults de Hibernate para leer lentamente 90 millones de registros

Usar setFirstResult y setMaxResults es la única opción que conozco.

Tradicionalmente, un conjunto de resultados desplazable solo transferiría filas al cliente según sea necesario. Desafortunadamente, MySQL Connector/J en realidad lo falsifica, ejecuta toda la consulta y la transporta al cliente, por lo que el controlador en realidad tiene todo el conjunto de resultados cargado en la RAM y se lo enviará por goteo (evidenciado por sus problemas de falta de memoria) . Tuviste la idea correcta, son solo deficiencias en el controlador Java de MySQL.

No encontré forma de evitar esto, así que cargue grandes porciones usando los métodos regulares setFirst/max. Lamento ser el portador de malas noticias.

Solo asegúrese de usar una sesión sin estado para que no haya caché de nivel de sesión o seguimiento sucio, etc.

EDITAR:

Su ACTUALIZACIÓN 2 es lo mejor que obtendrá a menos que salga de MySQL J/Connector. Aunque no hay razón por la que no pueda aumentar el límite de la consulta. Siempre que tenga suficiente RAM para mantener el índice, esta debería ser una operación algo económica. Lo modificaría ligeramente, y tomaría un lote a la vez, y usaría la identificación más alta de ese lote para tomar el siguiente lote.

Nota:esto solo funcionará si otras_condiciones use igualdad (no se permiten condiciones de rango) y tenga la última columna del índice como id .

select * 
from person 
where id > <max_id_of_last_batch> and <other_conditions> 
order by id asc  
limit <batch_size>