簡體   English   中英

NHibernate查詢超時

[英]NHibernate query timing out

我收到以下NHibernate超時異常:

could not execute query

內部異常消息為:

Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.

這是失敗的NHibernate代碼:

shareClassReturns = _session.CreateCriteria<ShareClassTrailingReturn>()
        .Add(LambdaSubquery.Property<ShareClassTrailingReturn>(x => x.ShareClass.Id).In(GetAvailableShareClassIds()))
        .Add(LambdaSubquery.Property<ShareClassTrailingReturn>(x => x.ShareClass.Id).In(GetShareclassIdsInCalculationGroup(peerGroups, classificationTypes)))
        .Add<ShareClassTrailingReturn>(c => c.CurrencyId == "GBP")
        .AddShareClassReturnOrder(order)
        .CreateCriteria<ShareClassTrailingReturn>(scr => scr.ShareClass, JoinType.InnerJoin)
        .Add(ApplicableIdentifiers(searchExpression))
        .AddShareClassOrder(order)
        .SetMaxResults(pageSize)
        .List<ShareClassTrailingReturn>();

這是我正在通過NHibernate Profiler查看的SQL(盡管我對其進行了一些整理,並用select top 25 *替換了我選擇的所有項目,以使其更具可讀性):

SELECT   top 25 *
FROM     offline.ShareClassTrailingReturn this_
         inner join ShareManager.ShareClass shareclass1_
           on this_.SCTR_ShareClassId = shareclass1_.ShareClass_Id
         left outer join DCS.ShareClassInfo shareclass1_1_
           on shareclass1_.ShareClass_Id = shareclass1_1_.[ShareClassInfo_MSShareClassId]
WHERE    
    this_.SCTR_ShareClassId in 
    (
        SELECT this_0_.[Fund_ID] as y0_
        FROM   dbo.Fund this_0_
            inner join CAP.DataUniverse datauniver1_
              on this_0_.[Fund_TypeID] = datauniver1_.[DataUniverse_TypeId]
                 and this_0_.[Fund_CountryID] = datauniver1_.[DataUniverse_CountryID]
        WHERE  datauniver1_.[DataUniverse_SiteId] = 100 /* @p0 */
    )
    and this_.SCTR_ShareClassId in 
    (
        SELECT this_0_.ShareClass_Id as y0_
        FROM   dbo.vCalculationGroup this_0_
        WHERE  
            this_0_.PeerGroupId in (1,8)
            and this_0_.ClassificationId in (7,1)
    )
    and this_.SCTR_CurrencyId = 'GBP'
    and 
    (
        shareclass1_.ShareClass_MEX like '%axa%' 
        or shareclass1_.ShareClass_SEDOL like '%axa%'
        or shareclass1_1_.ShareClassInfo_RIC like '%axa%'
        or shareclass1_.ShareClass_ISIN like '%axa%'
        or shareclass1_.ShareClass_CUSIP like '%axa%'
    )
ORDER BY shareclass1_.ShareClass_Name asc

如果我更改NHibernate標准,以便它不針對vCalculationGroup進行選擇,即如果我刪除此行:

.Add(LambdaSubquery.Property<ShareClassTrailingReturn>(x => x.ShareClass.Id).In(GetShareclassIdsInCalculationGroup(peerGroups, classificationTypes)))

或從SQL

    and this_.SCTR_ShareClassId in 
    (
        SELECT this_0_.ShareClass_Id as y0_
        FROM   dbo.vCalculationGroup this_0_
        WHERE  
            this_0_.PeerGroupId in (1,8)
            and this_0_.ClassificationId in (7,1)
    )

查詢不再超時。 這是否意味着我需要對該視圖執行某些操作? 像索引一樣?

有人可以建議我如何解決這個問題嗎?

編輯:我應該添加查詢從SQL Server Management Studio正常運行,並在大約6秒后返回。 盡管這樣說,但當我查看執行計划時,它報告在offline.ShareClassTrailingReturn上缺少索引。 這可能是問題所在嗎?

如果刪除該部分可以使其工作得更好,我一定會看一下該視圖上的索引編制。 在應用程序中檢查連接超時也是值得的。 如果您說它在Management Studio中僅需六秒鍾就可以正常工作,則可能是您的應用程序連接超時少於六秒鍾(或默認值為更少)。 這些將是一個很好的起點。

通常值得嘗試避免很多嵌套子查詢。 您所生成的SQL有很多內容。 有時,自己編寫SQL或HQL效率更高,而不是在Criteria或Linq NHibernate API中使用許多復雜的聯接。 您更有可能為工作生成高效的SQL!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM