Query too slow to export in excel

0

I have created a method to export some columns to xls and the process is very slow, it takes almost one minute to do the whole process.

    public void Download(string datainicio, string datafinal, int? searchContrato, string searchCliente, string tipo, string status)
    {
        DateTime dt1 = Convert.ToDateTime(datainicio);
        DateTime dt2 = Convert.ToDateTime(datafinal);

        var tbl_caminhos = db.tbl_caminho_backup.AsNoTracking().Where(x => x.ativo == true && x.tbl_cliente_verusbackuponline.ativo == true).ToList();
        var tbl_logs = db.vw_logs_backuponline.AsNoTracking().Where(x => DbFunctions.TruncateTime(x.data_inicio) >= DbFunctions.TruncateTime(dt1) && DbFunctions.TruncateTime(x.data_inicio) <= DbFunctions.TruncateTime(dt2)).ToList();

        //List<vw_logs_backuponline> tbl_logs = null;
        if (!String.IsNullOrEmpty(tipo))
        {
            tbl_caminhos = tbl_caminhos.Where(x => x.tipo == tipo).ToList();

            tbl_logs = tbl_logs.Where(s => s.log_tipo == tipo).ToList();
        }
        if (!String.IsNullOrEmpty(searchCliente))
        {
            tbl_caminhos = tbl_caminhos.Where(x => x.tbl_cliente_verusbackuponline.nome_razao.ToLower().Contains(searchCliente.ToLower())).ToList();
            tbl_logs = tbl_logs.Where(s => s.nome_razao.ToLower().Contains(searchCliente.ToLower())).ToList();
        }
        if (searchContrato != null)
        {
            tbl_caminhos = tbl_caminhos.Where(x => x.tbl_cliente_verusbackuponline.contrato == searchContrato).ToList();

            tbl_logs = tbl_logs.Where(s => s.contrato == searchContrato).ToList();
        }
        if (!String.IsNullOrEmpty(status) && status == "0")
        {
            tbl_caminhos = tbl_caminhos.Where(x => !tbl_logs.Select(l => l.id_caminho_backup).Contains(x.id_caminho_backup)).ToList();

            tbl_logs = tbl_logs.Where(s => s.data_fim != null).ToList();
        }
        if (!String.IsNullOrEmpty(status) && status == "1")
        {
            tbl_caminhos = null;
            tbl_logs = tbl_logs.Where(s => s.data_fim != null).ToList();
        }

        if (tbl_caminhos != null)
        {
            for (DateTime dtRef = dt1; dtRef <= dt2; dtRef = dtRef.AddDays(1))
            {
                //aqui pego todos os caminhos cadastrados para os clientes
                foreach (var caminhos in tbl_caminhos)
                {
                    //verifico se existe um log para o caminho, se tiver eu sei que foi realizado o backup
                    if (tbl_logs.Where(x => x.id_caminho_backup == caminhos.id_caminho_backup && (x.data_inicio >= dtRef && x.data_inicio <= dtRef)).Count() <= 0)
                    {
                        //se entrou aqui é pq não existe um log para o caminho, então crio uma linha de falha do backup
                        vw_logs_backuponline log = new vw_logs_backuponline();
                        log.contrato = caminhos.tbl_cliente_verusbackuponline.contrato;
                        log.nome_razao = caminhos.tbl_cliente_verusbackuponline.nome_razao;
                        log.cidade = caminhos.tbl_cliente_verusbackuponline.cidade;
                        log.log_tipo = caminhos.tipo;
                        log.data_inicio = dtRef;
                        log.hora_inicio = caminhos.tbl_cliente_verusbackuponline.hora_backup;
                        log.bucket = caminhos.tbl_cliente_verusbackuponline.bucket;
                        log.hora_backup = caminhos.tbl_cliente_verusbackuponline.hora_backup;
                        log.msg_operacao = "<span class='glyphicon glyphicon-alert' aria-hidden='true'></span>";
                        log.caminho_ativo = true;

                        tbl_logs.Add(log);
                    }
                }
            }
            //aqui removo os com sucesso quando a busca é apenas os com falhas
            if (!String.IsNullOrEmpty(status) && status == "0")
            {
                tbl_logs.RemoveAll(x => x.data_fim != null);
            }

        }
        var logs = tbl_logs.Select(x => new LogsBackup() { Contrato = x.contrato, Modalidade = x.log_tipo, Cidade = x.cidade, UF = x.uf, Nome_Razao = x.nome_razao, Dias_Backup = (x.data_inicio - x.data_fim).ToString().FirstOrDefault().ToString() }).AsQueryable().ToList();

        try
        {
            GridView gridView = new GridView();

            gridView.DataSource = logs;
            gridView.DataBind();

            Response.ClearContent();
            Response.Buffer = true;
            Response.AddHeader("content-disposition", "attachment;filename=" + datafinal + "VerusBackup.xls");
            Response.ContentType = "application/vnd.ms-excel";
            Response.Charset = "";

            using (StringWriter stringWriter = new StringWriter())
            {
                using (HtmlTextWriter htmlTextWriter = new HtmlTextWriter(stringWriter))
                {

                    gridView.RenderControl(htmlTextWriter);
                    Response.Output.Write(stringWriter.ToString());
                    Response.Flush();
                    Response.End();
                }
            }
        }
        catch (Exception ex)
        {

            throw ex;
        }

    }

Script in View:

  $("#btnExportar").click(function (e) {
    var datainicio = $('#datainicio').val();
    var datafinal = $('#datafinal').val();
    var searchContrato = $('#searchContrato').val();
    var tipo = $('#tipo').val();
    var status = $('#status').val();
    $.ajax({
        type: 'GET',
        url: "@Url.Action("Download", "logsbackuponline")",
        data: { datainicio: datainicio, datafinal: datafinal, searchContrato: searchContrato, tipo: tipo, status: status },
        async: true,
        success: function (Result) {
            window.location = '/logsbackuponline/Download?datainicio=' + datainicio + '&datafinal=' + datafinal + '&searchContrato=' + searchContrato + '&tipo=' + tipo + '&status=' + status;
        }
    })        
}); 
    
asked by anonymous 21.03.2018 / 13:22

1 answer

3

From the start you can take all of these ToList() and run the query only at the end. Example:

var tbl_caminhos = db.tbl_caminho_backup.AsNoTracking().Where(x => x.ativo && x.tbl_cliente_verusbackuponline.ativo);


if (!String.IsNullOrEmpty(tipo))
{
    tbl_caminhos = tbl_caminhos.Where(x => x.tipo == tipo);
}


var caminhos = tbl_caminhos.ToList();

So the query is executed only once, at the end when all the filters are applied.

After that, we can analyze the amount of records, or other factors that may be causing the slowness

  

ps. you do not need to compare a bool field with true, ativo == true , ativo will already return true or false

    
21.03.2018 / 13:42