2012-02-21 21 views
0

以下の基準は許容できないほど遅く実行されています。テーブルのプライマリキーまたはインデックスに詳細を入力しなくても、これをより高速に実行できるような特別なものはありますか?Grailsの基準が遅すぎる

def results = OpportunityApplication.createCriteria().list() { 

      isNull('dateDeleted') 

      or { 
       opportunityInst { 
        isNull('dateDeleted') 
        opportunity { 
         isNull('dateDeleted') 
         gt('advertisingEndDate', new Date()) 
         eq('useOrgAsContact', false) 
        } 
        opportunityLocation { 
         isNull('dateDeleted') 
         eq("email", user.email) 
        } 
       } 

       if (isPartner) 
       { 
        opportunityInst { 
         isNull('dateDeleted') 
         opportunity { 
          isNull('dateDeleted') 
          gt('advertisingEndDate', new Date()) 
          eq('useOrgAsContact', true) 
          organisation { 
           isNull('dateDeleted') 
           eq("email", user.email) 
          } 
         } 
        } 
       } 
      } 

     } 
+0

を次のように共有スニペットに繰り返さビットの周りを移動することでしたクエリの述語のうち –

+0

@Donそれはほとんど建設的ではありませんが、私は彼がdbスキーマを投稿する必要があることに完全に同意します。 –

+0

SQLロギングをオンにすると、生成されたクエリを取得し、その上で 'EXPLAIN'を実行できます。それはちょうど推測よりも良いでしょう。 –

答えて

0

私の基準への最適化は非常に単純です。私がしなければならなかったすべては、私が提案することができるすべては、あなたがDBからの大量のデータを削除したり、多くを削除することで、データベースや要件については何も知らず

opportunityInst { 
       isNull('dateDeleted') 
       opportunity { 
        isNull('dateDeleted') 
        gt('advertisingEndDate', new Date()) 
       } 
       or { 
        if (isPartner) 
        { 
         opportunity { 
          eq('useOrgAsContact', true) 
          organisation { 
           isNull('dateDeleted') 
           eq("email", user.email) 
          } 
         } 
        } 
        and { 
         opportunity { 
          eq('useOrgAsContact', false) 
         } 
         opportunityLocation { 
          isNull('dateDeleted') 
          eq("email", user.email) 
         } 
        } 
       } 
      } 
関連する問題