我有一些代码,它有一个存储过程执行来填充DTO,用于显示用户的数据表。
例如,存储过程将输出20个记录,包含17列,从9个表中提取,大约需要1.3秒。存储过程完美无缺。
在我的C#代码中,我有一个DTO,其列与存储过程完全相同,数据类型相同。我运行以下代码来填充DTO:
public IEnumerable<AgentActivityOrdersShortDTO> GetAgentActivityOrdersReport(DateTime currentDate, DateTime ordersBeforeDate, AgentActivityReportType reportType)
{
var listOfOperations = _oms.GetSPSOperationsFromBalOperation((int)_ctx.TenantInfo.Operation, true).Select(o => o.SPSOperationMapping).ToList();
var stringOfOperations = listOfOperations.Aggregate("", (current, o) => current + (o.ToString() + ","));
IList<AgentActivityOrdersShortDTO> results = null;
switch (reportType)
{
case AgentActivityReportType.ListingAgent:
results = _sdsp.CurrentSession.CreateSQLQuery("exec GetActivityReport_OrderData_LA :CurrentDate, :OrdersBeforeDate, :OperationIds")
.SetParameter("CurrentDate", currentDate)
.SetParameter("OrdersBeforeDate", ordersBeforeDate)
.SetParameter("OperationIds", stringOfOperations)
.SetResultTransformer(Transformers.AliasToBean(typeof(AgentActivityOrdersShortDTO)))
.List<AgentActivityOrdersShortDTO>()
.ToList();
break;
case AgentActivityReportType.SellingAgent:
results = _sdsp.CurrentSession.CreateSQLQuery("exec GetActivityReport_OrderData_SB :CurrentDate, :OrdersBeforeDate, :OperationIds")
.SetParameter("CurrentDate", currentDate)
.SetParameter("OrdersBeforeDate", ordersBeforeDate)
.SetParameter("OperationIds", stringOfOperations)
.SetResultTransformer(Transformers.AliasToBean(typeof(AgentActivityOrdersShortDTO)))
.List<AgentActivityOrdersShortDTO>()
.ToList();
break;
}
return results.ToList();
}
有些日子,这没有问题。其他日子,我得到了我今天所经历的:
超时已过期。操作完成之前经过的超时时间或服务器没有响应。
它似乎是间歇性的,我偶尔通过删除和重新创建存储过程,或者通过刷新和填充数据库的索引来“修复”它。但这些不是对数期限的解决方案。
关于如何修复的想法或想法会很棒。
答案 0 :(得分:0)
如果删除并重新创建存储过程“修复”它,那么它指向重新编译解决问题的查询计划,并且缓存的计划不是最佳。
首先尝试将“WITH RECOMPILE”添加到代码调用的2个存储过程中。
查看参数嗅探文章的背景知识。 例如: http://www.brentozar.com/archive/2013/06/the-elephant-and-the-mouse-or-parameter-sniffing-in-sql-server/