2009-03-13 15 views
4

この週のPodcastに似た問題があります。 Hibernate Queryはシステムでは遅く実行されますが、直接実行すると速くなります

は、我々は2005年

Hibernateはクエリを生成している私たちのためにそれが完了するまでに約20分を取っているSQL Serverと休止状態使用してJavaアプリケーションを持っています。

show_sqlを使用して同じクエリを使用し、疑問符を定数値に置き換えた場合は、すぐに回答が返されます。

私はオプション(再コンパイル)が必要だと思いますが、HQLでそれを行う方法を理解できません。

助けてください!

+0

他のハイバネートクエリは正常に実行されていますか? –

+0

hibernateオブジェクトとクエリコードとそれが生成しているSQLを投稿してください。 –

+0

Kees、 Yess、他のクエリは正常に実行されています。 あいにく、休止状態のオブジェクトとクエリコードは、あまりにも複雑すぎて共有できません。 –

答えて

4

問題の説明から、パラメータスニッフィングを実行しているようです。基本的にSQL Serverは、渡されたパラメータセットの古いセットに基づいてクエリプランを作成していますが、現在実行中のクエリに対して有効な実行プランを作成していません。

通常、この問題は、ローカル変数にパラメータ値を渡し、クエリまたはOPTION(RECOMPILE)を使用してこの問題を解決します。しかし、あなたがHibernateを使用しているので、私の通常の解決策はあなたの選択肢ではありません。私が理解しているように、Hibernateを使用してprepareStatement()またはcreateSQLQuery()を使用してネイティブSQLクエリを実行することが最善の方法ですが、残念ながら、Hibernateを使用する利点の一部が削除されます。

+0

退役した感謝、エレミヤ。これは私が結んだ解決策でした.Hibernateでステートメントを生成し、SQLを取り出して直接実行しました。 –

+2

すべてこの記事で説明されています:http://www.sommarskog.se/query-plan-mysteries.html –

0

マッピングとHQLステートメントを投稿する必要があります。あなたのHQLで "join"を使用している場合は、Hibernateが正確に何を取得しているかを見てみることをお勧めします。要求自体は単純ですが、Hibernateはそれに到達する前に大量のデータを取得しています。

1

私の経験では、Hibernateでの複雑なクエリの主な問題はクエリ自体ではなく、結果セットを表すすべてのオブジェクトの作成です。

私の場合、仕事では非常に大きなドメインモデルを持っていました。カップリングがたくさんあるため、データベースから1つのオブジェクトをフェッチするにも、そのオブジェクトは他のオブジェクトにリンクされていたため他のオブジェクトなどに送信します。

私たちのために、遅延ロードを使用すると、問題の少なくとも一部が解決されました。スマートキャッシングはさらに助けになりました。私が学んだのは、将来、ドメインクラス間のより緩やかな結合を可能にするということです。

関連する問題