sql >> データベース >  >> RDS >> Mysql

HibernateのScrollableResultsを使用して9千万件のレコードをゆっくりと読み取る

    setFirstResultとsetMaxResultsを使用することが、私が知っている唯一のオプションです。

    従来、スクロール可能な結果セットは、必要に応じて行をクライアントに転送するだけでした。残念ながら、MySQL Connector / Jは実際にそれを偽造し、クエリ全体を実行してクライアントに転送するため、ドライバーは実際に結果セット全体をRAMにロードし、それをドリップフィードします(メモリ不足の問題によって証明されます) 。あなたは正しい考えを持っていました、それはMySQLJavaドライバーの単なる欠点です。

    これを回避する方法が見つからなかったため、通常のsetFirst/maxメソッドを使用して大きなチャンクをロードしました。悪い知らせを持ってきてすみません。

    セッションレベルのキャッシュやダーティトラッキングなどがないように、必ずステートレスセッションを使用してください。

    編集:

    UPDATE 2は、MySQL J / Connectorから抜け出さない限り、取得するのに最適です。クエリの制限を引き上げることができない理由はありませんが。インデックスを保持するのに十分なRAMがあれば、これはやや安価な操作になるはずです。少し変更して、一度にバッチを取得し、そのバッチの最大IDを使用して次のバッチを取得します。

    注:これは、 other_conditionsの場合にのみ機能します 等式を使用し(範囲条件は許可されません)、インデックスの最後の列を idにします。 。

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


    1. バイナリデータをディスクに保存するスクリプト

    2. MariaDB CONNECTION_ID()の説明

    3. varchar値'simple'をデータ型intに変換するときに変換に失敗しました

    4. T-SQL火曜日#65:何か新しいことを教える