Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verwendung von ScrollableResults von Hibernate zum langsamen Lesen von 90 Millionen Datensätzen

Die Verwendung von setFirstResult und setMaxResults ist Ihre einzige Option, die mir bekannt ist.

Herkömmlicherweise würde ein scrollbares Resultset Zeilen nur nach Bedarf an den Client übertragen. Leider täuscht der MySQL Connector/J es tatsächlich vor, er führt die gesamte Abfrage aus und transportiert sie zum Client, sodass der Treiber tatsächlich die gesamte Ergebnismenge im RAM geladen hat und sie Ihnen per Tropf-Feed zuführt (bewiesen durch Ihre Speicherprobleme). . Sie hatten die richtige Idee, es sind nur Mängel im MySQL-Java-Treiber.

Ich fand keine Möglichkeit, dies zu umgehen, also fuhr ich fort, große Chunks mit den regulären setFirst/max-Methoden zu laden. Tut mir leid, der Überbringer schlechter Nachrichten zu sein.

Stellen Sie nur sicher, dass Sie eine zustandslose Sitzung verwenden, damit es keinen Cache auf Sitzungsebene oder schmutziges Tracking usw. gibt.

BEARBEITEN:

Ihr UPDATE 2 ist das Beste, was Sie bekommen werden, es sei denn, Sie brechen aus dem MySQL J/Connector aus. Obwohl es keinen Grund gibt, warum Sie das Limit für die Abfrage nicht erhöhen können. Vorausgesetzt, Sie haben genügend RAM, um den Index zu speichern, sollte dies eine etwas billige Operation sein. Ich würde es leicht modifizieren und einen Stapel nach dem anderen holen und die höchste ID dieses Stapels verwenden, um den nächsten Stapel zu holen.

Hinweis:Dies funktioniert nur, wenn other_conditions Verwenden Sie Gleichheit (keine Bereichsbedingungen erlaubt) und haben Sie die letzte Spalte des Index als id .

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