2012-05-09 9 views
3

大量のデータ(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を放棄する予定はありません。

+0

クエリが何であり、どのように条件を作成するかを知ることは、それを最適化するのに役立ちます。 –

+0

私は約2年前と非常によく似た状況にあった。主な問題は、ドメインに非常に多くの選択を引き起こす多くの遅延コレクションがあることでした。これと他のパフォーマンスの問題は、JProfilerでプロファイリングすることで非常に簡単に特定できます。http://www.ej-technologies.com/products/jprofiler/overview.html – heikkim

+0

Hibernateがどのように設定されているかについての詳細を提供した場合に役立ちます。 「基準」はどのように定義されていますか?永続オブジェクトはどのように定義されていますか? 'while(result.next())... 'ブロックのコードは何ですか?これらの回答、およびその他の関連する詳細は、役に立つ回答を得る上で貴重です。 –

答えて

0

私はtalendが何であるか分かりませんが、それはデータベースGUIツールの一種と思われますか?

この場合、オブジェクトを脱水するための休止状態、つまり取得されたオブジェクトがまだセッションにないことを確認し、インスタンスを作成し、すべてのプロパティを(おそらく他の参照されたエンティティで) 。

実際にすべてこれはあなたが実際には同じSQL文を実行することを前提としてい

詳細に何が起こっているのを確認するためにプロファイラを使用してください。コメントに記載されているように、あなたの基準とあなたのマッピングに応じて、Hibernateは非常に興味深いselect文を作成するかもしれません。

関連する問題