2017-08-08 22 views
0

これら二つのスニペットの応答で最速です:実行時間が速いのはどちらですか?hqlまたは標準のsql?

String hql = "from Menu where groupeMenu = :gm"; 
Query query = sessionFactory.getCurrentSession().createQuery(hql); 
query.setParameter("gm" , criteres.get("gmnu_code")); 
@SuppressWarnings("unchecked") 
List<Menu> listMenu = (List<Menu>) query.list(); 

か:

String sql = "select menu_id from menu where gmnu_code = :gm"; 
Query query = sessionFactory.getCurrentSession().createSQLQuery(sql); 
query.setParameter("gm" , criteres.get("gmnu_code")); 
@SuppressWarnings("unchecked") 
List<Menu> listMenu = (List<Menu>) query.list(); 
+0

あなたはそれを試してみませんか?実際には、大きな違いはありません。 – Jesper

+0

しかし、テーブルにはより多くの行が含まれます違いがありますか? – pheromix

+0

DBにどのくらいのカラムが存在するかを測定しません。現在のケースでは、唯一の違いは、HQLが解析されてネイティブSQLに変換され、一定の時間で作られ、@Jesper 2番目のケースの利益は非常に小さくなります。 –

答えて

1

通常、基礎となるデータベースは、SQL要求のみを受け入れ、そしてあなたも、生成されたクエリを表示するには、スプリングを求めることができます。違いは、hqlを使用するときには、春に依存してレコードセットを解析してオブジェクトを与え、生のSQLを使用するときは、レコードセットをどのように処理するかを指定する必要があるということです。

これは、データベースの観点からは全く違いがないことを意味します(このような単純なクエリの場合、hqlはexpample.sqlで変換されます)。また、クライアント上では、スプリングが生成するより最適化されたコードを生成できるかどうかによって異なります。良い質問は、それが価値があるかどうかだけです。なぜなら、最終的にはテストと保守を生成するコードが増えるからです。経験則では、特定のクエリでパフォーマンスの問題が発生しない限り、hqlが最適な方法であり、生のSQLは特定のユースケースからのみ使用する必要があります。

0

私が実行した2番目のクエリは、あなたが投稿したコードではうまくいかないでしょう。 SQL結果をMenuエンティティにマップするロジックはありません。

通常、複雑なクエリの場合、純粋なSQLは高速です。とにかにHibernateはエンティティからSQLを生成し、生成されたクエリは本当に複雑になることがあります(特に熱心な関係がある場合)。

しかし...

IDを取得すると、N + 1クエリに問題が発生します。したがって、まずすべてのIDを取得し、次に各IDに対してエンティティのすべてのフィールドを取得します。この場合、Hibernateによって生成された1つの大きなクエリではなく、N + 1回の実際のDBクエリのために純粋なSQLが遅くなります。

JDBCテンプレートを使用すると、純粋なSQLを実行し、行マッパーを追加して結果をエンティティにマップできます。しかし、単純な読み込み以外のものが必要な場合(たとえば、すべてのエンティティを更新する必要がある場合)、HQLを使用する方がより合理的です。

0

あなたの例では、sql ond hqlには1つの違いがあります。 SQLを使用すると、実際に必要な列だけを取得できます。

hqlはsqlに変換されますが、EAGERフェッチタイプのすべての列が取得されます。 HQL自体では、列を指定することはできません。

関連する問題