2012-01-23 16 views
0

私は作業していますアプリケーションは非常に大量のデータを読み込み、データベースからの100,000を超えるレコードのオーダーの時間を要する統合レポートを生成する必要があります。われわれが探しているのは、grails/hibernate(アプリケーション全体のdefacto ORMとして使用している)を使用していて、うまく機能していないことです。あるケースでは、10,000レコードのように小さい結果セットを照会する場合でも、1.3+秒かかる。私は行方不明またはそのような要件のネイティブSQLに移動する方が良い場合、チューニングがあるかどうか分かります。grailsのパフォーマンスの最適化

テーブルは非常にシンプルであり、ジョインはありません。データをフィルタリングするための基準としてHibernateを使用することを好む唯一の理由は非常に動的で、複数のオプションの列が生成されます。

答えて

2

このリンクをチェックしてください。非常に洞察力のある。ガイは、彼が2時間以上から100分の記録をロードしてからわずか3分になったことを示しています。
http://naleid.com/blog/2009/10/01/batch-import-performance-with-grails-and-mysql/

+0

私たちは実際にそれを見て、100行ごとに虫をクリーンアップしました。それは素晴らしい仕事をし、我々はそれをオフにして、40分の負荷から6分の負荷に行くことができます。一週間後にもう一度試してみると、なぜ動作しなくなったのか分かりません。 – TekOps

2

中間層に100,000レコードを渡すためにデータベースにクエリして、そのレポートの計算を実行できますか?答えが「はい」の場合は、そのレポートのストアドプロシージャまたはビューを検討し、データベースサーバー上で計算を行い、レポートの生成時にデータ量と処理量を減らすことができます。

外部キーを含むWHERE句のすべての列に索引があることを確認してください。 HibernateとEXPLAIN PLANから生成されたSQLを取得して、時間の使用場所を確認します。

これは人々がHibernateで持っている1つの問題です。生成されたSQLが十分にパフォーマンスが足りない場合の対処方法です。 Hibernateが仕事をすることができないなら、まっすぐなJDBCやiBatisのような何かに頼らなければならないかもしれません。

+0

hibernateを使用すると、列名を制限できますか?つまり、すべての列を返すのではなく、パフォーマンスを向上させる可能性のあるデータを減らすことができると思います。 – Amit

+0

HQLを使用できますが、問題はORMマッピングを依然として参照するということです。 – duffymo