2012-02-21 110 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

不知道你的數據庫,或者要求什麼,我可以建議是,你從數據庫中刪除大量數據或刪除大量來自查詢的謂詞 – 2012-02-21 15:33:35

+0

@Don這並不具有建設性,但我完全同意他需要發佈數據庫模式。 – 2012-02-21 15:46:06

+0

如果您打開SQL日誌記錄,您可以獲取生成的查詢並對其運行'EXPLAIN'。那會比猜測更好。 – 2012-02-21 16:52:48

回答

0

對我的標準進行的優化非常簡單。我所要做的就是圍繞重複位移動到一個共享的代碼片段如下

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) 
         } 
        } 
       } 
      }