質問

HQLとCriteriaAPIとQueryoverの間のパフォーマンス違いは何ですか?1つが他のものより速くまたは遅い状況はありますか?

編集:質問をQueryOverとLinq。

=======================================P>

ええと、私は答えとしてマークするのかどうかわからないので、ほとんどの投票アップで投稿をマークします。知りません。これは実際に質問よりも多くの議論です。

役に立ちましたか?

解決

ICRITERIAとHQLのパフォーマンス特性は、1つの単純な理由で少しずつ異なります(QueryOverについてはわかりません)。

ICRITERIAクエリは、デフォルトでは、マッピングで定義されているとおりにフェッチ戦略を実装しようとしていますが、既定ではすべての怠惰とクエリ内での参加宣言に依存し、EAGERにフェッチしているかどうかを定義します。

追加的にICRITERIAはパラメータ通過のマッピングに依存しますが、HQLは明示的なパラメータタイプを使用できます。 iQuery.SetInt32( "fooparam"、5);

ICRITERIAクエリのプラグのプラグのあるものです(ICRITERIA.CREATECRITERIA()を参照)NHエンジンがICRITERIAを解決し、最も有効なSQLを生成しようとします。

反対側には、HQLクエリが一貫した結果を生み出すかどうか、およびQueryCacheの使用が容易になるかどうかを予測する方がおそらく簡単になります。

どちらかの方法では、IsessionFactoryの作成とマッピング定義とマッピング定義で一度設定されています。

実際のSQL生成は2つの間で異なるようにされ、それがICRITERIA - > HQLのユーティリティが存在しない理由です。

最後に、私の経験は私が2の間の性能がおそらく同じ与える、またはいくらかのミリ秒を摂取することを私に示しました。

サイドノートとして、マッピングでできるだけ宣言すると、たとえば、nhibernate操作などがより簡潔なSQL生成にもたらされます。データベースに進む前に。

他のヒント

QueryOverに関する限り、そのAPIの拡張子として構築されているため、パフォーマンスが基準APIと同じであると予想されます。そのため、2つのAPI内の同等のクエリの場合、同じデータベースクエリを生成することが期待されます。QueryOverとCriteriaのインタフェースの間に記載されている唯一の違いは、QueryOverインターフェイスが「クリーナー」になるように、より快適なQueryOverインターフェースを見つけることです。

私の経験では、基準APIはHQLインターフェースよりも「愛」を受けました。HQLインターフェイスで表現する等価な方法を見つけることができなかったCriteriaインタフェースを使用して特定のクエリを表現できる場合があります。

パフォーマンスに関しては、クエリが「尋ねられた」とは、Criteria APIとHQLとQueryOverの選択よりもパフォーマンスが高い方法があります。私はあなたの考えに最も自然なフィット感を提供するインターフェースを使うでしょう。

QueryOverは、シンタックスとタイプ安全性の向上のために、ほとんどの点で基準のための非常に良い交換です。ただし、QueryOver CAN でラムダ表現を処理すること(そして私はLINQクエリに対しても同じことを推測する)であることに注意すべきです。そのため、End SQLクエリを実行しても、他のメソッド(ICRITERIA、HQL)よりも長く行われない場合は、クエリオブジェクトを適切なSQLクエリに変換してください。

例として、毎秒何百ものQueryOverクエリを実行していたアプリケーションを開発しており、クエリをICRITERIAに変換することがわかっています。クエリと半分のCPU使用率を実行する機能。 2番目ルレベルのキャッシュとクエリキャッシュを使用すると、Lambda式の処理に関わるオーバーヘッドを大幅に削減できると思います。しかし、これは私たちのアプリケーションに適していないので、私はこれを私自身をやっていません。

あなたのより一般的な質問に関しては速いほど:それは本当に依存します。唯一の確実な発言の方法はプロファイリングツールを実行することです(このようなシナリオのためのNHPROF Works Workersの不思議)。しかし、一般的に言って、HQLはSQLと最も柔軟で最も柔軟で、あなたのクエリを最適化するためにもう少し範囲の範囲を備えています。ただし、単純な中間の複雑さクエリの大部分の大部分は、ICRITERIAとHQLの間に差はほとんどありません。そして、クエリが動的に構築されている場合、ICRITERIAクエリは扱いやすいです。

私は2つの間の違いをまだ見つけていません。と言われている - HQLは、基準-APIで利用できない機能を持っています。

主にそれは前者または後者を使うならば、それはスタイルと個人的な好みの問題です。そして、クエリからSQLへの翻訳は、クエリになると多くのことを説明しません。

私よりも知っている人から: http://ayende.com/blog/archive/2009/06/01/nhibernate-queries-dash-should-i-us-hql-or-criteria.aspx

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top