[英]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.