将AliasToBean与存储过程一起使用时超时

时间:2015-07-06 22:07:44

标签: c# sql-server stored-procedures

我有一些代码,它有一个存储过程执行来填充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();
}

有些日子,这没有问题。其他日子,我得到了我今天所经历的:

  

超时已过期。操作完成之前经过的超时时间或服务器没有响应。

enter image description here

它似乎是间歇性的,我偶尔通过删除和重新创建存储过程,或者通过刷新和填充数据库的索引来“修复”它。但这些不是对数期限的解决方案。

关于如何修复的想法或想法会很棒。

1 个答案:

答案 0 :(得分:0)

如果删除并重新创建存储过程“修复”它,那么它指向重新编译解决问题的查询计划,并且缓存的计划不是最佳。

首先尝试将“WITH RECOMPILE”添加到代码调用的2个存储过程中。

查看参数嗅探文章的背景知识。 例如: http://www.brentozar.com/archive/2013/06/the-elephant-and-the-mouse-or-parameter-sniffing-in-sql-server/