2016-09-16 1 views
0

私はデータベース上で何度も(シンプルで複雑な)クエリを行う必要があるアプリケーションに取り組んでいます。Grailsでデータベースをクエリする効率的な方法はどれですか? SQL、HQLまたはGORM?

簡単なクエリでは、上記のアプローチの間に大きな違いはないことが理解できます。

私は、半複雑で複雑なクエリの場合に効率的な方法を知りたいと思います。

私は

Class Sample{ 
      String firstName 
      String lastName 
      long timeStamp 
    } 

は今、私は最新の二つのレコード。だから私は

  1. SQL query

    select first_name, last_name from sample order by time_stamp desc limit 2; 
    
  2. を書くことができますいずれかを取得したい Domainクラスと言ったとし
  3. データベースを照会するための効率的な方法となりますクエリこのうち

    String queryString = "select firstName, lastName from Sample order by timeStamp desc" 
    
    List sampleList = Sample.executeQuery(queryString, [max: 2, offset: 0]) 
    
  4. GORMクエリ

    def list = Sample.list(max: 2, sort: "timeStamp", order: "desc") 
    

答えて

1

これら3つの間には大きな違いはありません。クエリログを有効にすると、3つのケースすべてでSQLがほぼ同じであることがわかります。

ただし、HQLまたはGORMを使用している場合は、クエリの結果をキャッシュすることができます。これにより、クエリが頻繁に同じ結果を返す場合、効率が向上する可能性があります。一方、クエリが(例えばsampleテーブルが頻繁に更新されるため)同じ結果を返すことはめったにない場合、クエリキャッシングを有効にすると効率が低下する可能性があります。

最終的には、このレベルでのパフォーマンスの心配は時期尚早の最適化のケースです。私は、この場合GORMと思われる最も簡単なことをお勧めし、パフォーマンスの問題が特定された場合にのみパフォーマンスを心配しています。

1

最も速く最も効果的な方法は、方言固有のSQLクエリを使用し、ORMを使用しないことです。

GORM/Hibernateでは、これらの方法に大きな違いはありませんが、コードの可読性がより重要です。この場合、findAllBy*を適用することができない限り、criteria queriesがSQL/HQLの対応よりも優先されます。

1

前述のインジェクタのように、ネイティブSQLクエリは、常に要求された結果を取得する最も効率的な方法です。

他のすべてのアプローチは、GORM-Datastore respの実装に依存します。クエリマッピングの実装クエリーがデータベースに送信される前に、両方の(HQLとcritera)クエリーをネイティブSQLダイアレクト(SQLデータベースを使用する場合)に変換する必要があります。与えられた例では、両方の照会が同じネイティブSQLステートメントになります。

関連する問題