大量のデータ(10,000,000行を含むテーブルから最大100,000行)を抽出することを目的としたアプリケーションをちょうど担当しました。残念ながら、抽出はJava + Hibernateで書かれており、パフォーマンスは比較的劣ります。 Java + Hibernateを使用した100,000行の抽出には、約1分30秒かかります。 Talendを使用した同じ抽出には約30秒(3分の1以下)かかる。Hibernateの巨大なクエリの最適化
Launcher.initStatelessSession();
Launcher.beginStatelessTransaction();
//Creation of the Criteria crit, no join, only a single table is read.
int fetchSize = 1000;
crit.setFetchSize(fetchSize);
crit.setCacheable(false);
crit.setReadOnly(true);
ScrollableResults result = crit.scroll(ScrollMode.FORWARD_ONLY);
// Most of the time is spent from HERE ...
while (result.next()) {
// Some code but insignificant time compared to the result.next().
// I replaced this code with continue; and the speed did not really change.
}
// ... to HERE
このクエリをスピードアップする可能性が最適化上の任意のアイデアを:ここで
は、コードがどのように見えるかのサンプルですか?現在のところ、Hibernateを放棄する予定はありません。
クエリが何であり、どのように条件を作成するかを知ることは、それを最適化するのに役立ちます。 –
私は約2年前と非常によく似た状況にあった。主な問題は、ドメインに非常に多くの選択を引き起こす多くの遅延コレクションがあることでした。これと他のパフォーマンスの問題は、JProfilerでプロファイリングすることで非常に簡単に特定できます。http://www.ej-technologies.com/products/jprofiler/overview.html – heikkim
Hibernateがどのように設定されているかについての詳細を提供した場合に役立ちます。 「基準」はどのように定義されていますか?永続オブジェクトはどのように定義されていますか? 'while(result.next())... 'ブロックのコードは何ですか?これらの回答、およびその他の関連する詳細は、役に立つ回答を得る上で貴重です。 –