映射需要很长时间才能处理批量数据

时间:2017-05-18 07:34:31

标签: c# sql-server asp.net-mvc dapper

当我从SQL Server检索数据时,SQL查询窗口中的批量数据(2000000行)需要2分钟。但是使用dapper ORM作为列表进行映射需要很长时间(大约20分钟或更长时间)。

是否有任何想法可以提高映射的性能。

这是我的代码:

public List<T> DapperToList<T>(string SqlQuery, CommandType? CommandType = null) where T : class
{
    if (Con.State == ConnectionState.Open)
        Con.Close();

    Con.Open();

    var result = this.Con.Query<T>(SqlQuery, null, null, true, int.MaxValue, CommandType).ToList();

    Con.Close();

    return result;
}

public List<LOG_REPORTS> REPORT_LOG(DateTime? FROMDATE, DateTime? TODATE)
{
    DynamicParameters param = new DynamicParameters();

    param.Add("@FROMDATE", FROMDATE, DbType.DateTime);
    param.Add("@TODATE", TODATE, DbType.DateTime);

    var lstt = db.DapperToList<LOG_REPORTS>("PROC_LOG_REPORTS", param, CommandType.StoredProcedure);

    return lstt;
}

1 个答案:

答案 0 :(得分:0)

正如您在问题var result = this.Con.Query<T>(SqlQuery,.....)中所解释的那样,行需要20分钟才能执行。根据您的研究,执行查询需要2分钟,映射需要18分钟。

解决方案1:泵送分页数据

映射如此庞大的数据需要时间(以及内存和处理器......),并且几乎无法改进这一点。考虑使用ROW_NUMBER在数据库端进行分页,并一次泵一页。正如你所说,你正在向Excel写入数据;所以这应该不是问题。但这实际上会增加总时间,即使每批次时间减少,应用程序也会响应。

解决方案2:不要映射

你想写一个Excel,对吗?然后绕过Dapper并使用ADO.NET。将DataTable传递给Excel编写器模块。这将是巨大的收获。