web-dev-qa-db-ja.com

Hibernate Criteria vs HQL:どちらが速いですか?

私はいくつかの質問を読んでいますが、私はまだ混乱しています。なぜ?あなたが言及した違いはパフォーマンスに関係しないからです。それらは簡単な使用と関連しています(Objetc(criteria)およびSQL(hql))。しかし、何らかの理由で「基準」がhqlより遅いかどうかを知りたいです。

これを別の回答で読んだ

「HQLとcriteriaQueryのパフォーマンスには違いがあります。criteriaQueryを使用してクエリを実行するたびに、DBの最後にクエリされたキャッシュに反映されないテーブル名の新しいエイリアスが作成されます。これにより、生成されたSQLをコンパイルし、実行するのにより多くの時間がかかります。」バルン・メタによる。

これは非常に近いですが、!私は別のウェブサイト(http://gary-rowe.com/agilestack/tag/hibernate/)を読みます。これはHibernate 3.3以上ではもはやありません(これを読んでください:9)基準インターフェースに一貫性がありません)

違いを見つけようといくつかのテストを行いましたが、どちらもqryを生成し、テーブルのエイリアスを変更しません。

私はとても混乱しています。誰かが主な理由を知っている場合は、助けてください。ありがとう

63
kcobuntu

2004年にHibernate 3クエリトランスレータを作成したのは私です。そのため、その仕組みについては何か知っています。

基準は、理論的には、HQLクエリよりもオーバーヘッドが少ないはずです(名前付きクエリは除きます)。これは、Criteriaが何も解析する必要がないためです。 HQLクエリはANTLRベースのパーサーで解析され、結果のASTはSQLに変換されます。ただし、HQL/JPAQLでは、SessionFactoryの起動時にSQLが生成される名前付きクエリを定義できます理論的には、名前付きクエリはCriteriaよりもオーバーヘッドが少なくなります。

そのため、SQL生成のオーバーヘッドに関しては次のとおりです。

  1. 名前付きHQL/JPAQLクエリ-SQL生成は1回のみ発生します。
  2. 基準-生成する前に解析する必要はありません。
  3. (名前なし)HQL/JPAQLクエリ-解析してから生成します。

つまり、解析とSQL生成のオーバーヘッドに基づいてクエリ手法を選択することは、おそらく間違いです。通常、このオーバーヘッドは、実際のデータを使用して実際のデータベースサーバーで実際のクエリを実行する場合に比べて非常に小さくなります。アプリのプロファイリング時にこのオーバーヘッドが実際に現れる場合は、maybe名前付きクエリに切り替える必要があります。

基準とHQL/JPAQLを決定する際に考慮すべきことは次のとおりです。

  • 最初に、Hibernate-への依存性を使用して、[〜#〜] ok [〜#〜]かどうかを決定する必要があります独自のAPIコード内。 JPAには基準がありません。
  • 基準は多くのオプションの検索パラメーターの処理に非常に優れていますマルチパラメーターの「検索フォーム」を備えた典型的なWebページで見つけることができます。 HQLを使用すると、開発者はStringBuilderでwhere句の式に取り組む傾向があります(avoid this!)。 Criteriaを使用すると、その必要はありません。 Hardikも同様の意見を投稿しました。
  • HQL/JPAQLは、コードがより小さく、開発者が理解しやすい傾向があるため、他のほとんどのものに使用できます。
  • HQLを使用すると、頻繁に発生するクエリを名前付きクエリに変換できます。プロファイリングの後、後でこれを行うことを好みます。
141
Joshua Davis

私は何百万もの記録に取り組んでいます。 HQLはCriteriaよりもはるかに高速であることがわかりました。基準はパフォーマンスが大幅に遅れます。

大量のデータを処理する場合は、HQLに進みます。

9
Rajeev

HQLに対する基準のその他の利点

HQLを記述すると、コードが煩雑になります。きれいなオブジェクト指向コードを書くことはもうありません。

Criteria Queriesの作成中、IDEはIntellisenseを使用することを示唆しているため、変数名のようなものを二重引用符で記述する場合を除き、間違いを犯す可能性は低くなります。

5
omkar sirra

私は、動的なクエリに基準クエリを最も好んでいます。たとえば、パラメータに応じて、いくつかの順序を動的に追加したり、一部の部分(制限など)を残したりする方がはるかに簡単です。

一方、静的で複雑なクエリにはHQLを使用しています。HQLの理解と読み取りがはるかに簡単だからです。また、HQLはもう少し強力です。さまざまな結合タイプ用。

JPAおよびHibernate-基準とJPQLまたはHQL

5
Hardik Mishra

あなたは正しいです。結果リストは、org.hibernate.loader.Loaderクラスを使用してデータベースまたはキャッシュから取得されます。キャッシュが有効になっていない場合、SessionFactoryImpで作成されたDialectオブジェクトを使用して準備済みステートメントが構築されます。したがって、ステートメントはリスト呼び出しごとに初期化されます。また、低レベルのクエリが自動的に生成されます。基本的に、これは援助ですが、手動で記述した場合に特定のクエリがより効果的になる場合があります。

3
Simon