none
Como otimizar consulta sql com join no monthCalendar RRS feed

  • Pergunta

  • Boa tarde,

    Tenho o seguinte cenário, um calendário e um select de consulta no banco que vai dentro dele, a cada dia que eu seleciono no calendário ele faz um select no banco em quatro tabelas com join, até ai tudo funciona beleza , só que em perfomance ta terrível, ele demora em média 6 segundos para fazer cada select, ou seja em cada dia que eu clico ele demora em média 6 segundos, e não ta legal para o usuario, queria diminuir para no minimo 2 segundos. Se puderem me ajudar agradeço.


    Meu código dentro dele está o seguinte:

                     
    private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e)
            {
    
                conexaoDataSet = new DataSet();
    
                if (comboBox2.Text == "selecione uma opção" || comboBox2.Text == "")
                {
                    dataGridView2.DataSource = null;
                    MessageBox.Show("Selecione uma opção em Médico", "SELECIONE OPÇÃO", MessageBoxButtons.OK,    MessageBoxIcon.Exclamation);
                    label_dt.Text = "";
                    label26.Text = "";
                    this.Cursor = Cursors.Default;
                }
                else
                {
    
                      this.Cursor = Cursors.WaitCursor;                               
    
                      calendario1();//calendário 1 é a função que faz o select
                      this.Cursor = Cursors.Default;
    
                      atualizar_grid();
                      this.Cursor = Cursors.Default;
    
                }
    
            }
    
    
    
     private void calendario1()
            {
    
                conexaoDataSet = new DataSet();
    
                string conec = ConfigurationManager.ConnectionStrings["cn"].ToString();
                MySqlConnection conexao = new MySqlConnection(conec);
    
                label_dt.Text = monthCalendar1.SelectionRange.Start.ToShortDateString();
                try
                {
    
                    conexao.Open();
                    dataGridView2.DataSource = null;
    
    
                    string consu = "select a.HR ,b.dataa,b.Cd_Consulta,g.Nome_Paciente,CONCAT(SUBSTR(g.CPF,1,3),'.',SUBSTR(g.CPF,4,3),'.',SUBSTR(g.CPF,7,3),'-',SUBSTR(g.CPF,10,2))'CPF' , c.Nome_Medico, d.Descricao,p.Descri,b.Usuario from horario a left join consultas b on (a.Cd_hr=b.cd_hr and b.Dataa LIKE '%" + monthCalendar1.SelectionRange.Start.Date.ToString("yyyy-MM-dd") + "%' and b.cro  LIKE '%" + comboBox2.SelectedValue + "%') left join paciente g on g.cd_paciente=b.Cd_Paciente left join medico c on c.CRM=b.cro left join procedimentos d on d.cd_procedimento=b.cd_procedimento left join pagamento p on p.Cd_Pagamento=b.cd_pagamento order by a.Cd_hr";
    
                    MySqlDataAdapter conexaoAdapter = new MySqlDataAdapter(consu, conexao);
                    conexaoAdapter.Fill(conexaoDataSet, "consultas");
                    dataGridView1.DataSource = conexaoDataSet.Tables["consultas"];
    
                    //exibiçao datagrid 
                    dataGridView1.Columns["HR"].HeaderText = "Horarios";
                    dataGridView1.Columns["Cd_Consulta"].HeaderText = "Consulta";
                    dataGridView1.Columns["Dataa"].HeaderText = "Data";
                    dataGridView1.Columns["Nome_Paciente"].HeaderText = "Paciente";
                    dataGridView1.Columns["CPF"].HeaderText = "CPF";
                    dataGridView1.Columns["Nome_Medico"].HeaderText = "Medico";
                    dataGridView1.Columns["Descricao"].HeaderText = "Procedimento";
                    dataGridView1.Columns["Descri"].HeaderText = "Pagamento";
                    dataGridView1.Columns["Usuario"].HeaderText = "Marcado pelo Usuario(a)";
    
                    dataGridView1.Columns["HR"].Width = 64;
                    dataGridView1.Columns["Dataa"].Width = 74;
                    dataGridView1.Columns["Descri"].Width = 72;
                    dataGridView1.Columns["Usuario"].Width = 76;
                    dataGridView1.Columns["CPF"].Width = 99;
                    dataGridView1.Columns["Nome_Medico"].Width = 100;
                    dataGridView1.Columns["Cd_Consulta"].Width = 95;
                    dataGridView1.Columns["Descricao"].Width = 130;
    
                    
                }
                catch (MySqlException)
                {
    
                    MessageBox.Show("Erro de conexão!", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Error);
    
                }
    
                conexao.Close();
            }
    
    
    

    Preciso dar um jeito de otimizar essa consulta, deixar mais rápido, se puderem me ajudar agradeço

    terça-feira, 8 de dezembro de 2020 15:35

Todas as Respostas

  • Boa tarde,

    Não sei se vou conseguir ajudar, pois não estou familiarizado com os componentes utilizados, mas qual é o tipo de dados das colunas Dataa e Cro da tabela consultas?

    E como estão os valores no ComboBox2? Iguais aos armazenados na coluna Cro?


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 8 de dezembro de 2020 17:42
  • Boa tarde,

    desculpe a demora, o tipo de dados da coluna Dataa é por data "yyyy-MM-dd" e o do Cro é o "codigo do médico" a primary key da tabela medicos, ou seja ele faz o select buscando por data e codigo do médico em cada dia do calendário que eu clico. E vem meio lento, em torno de 8 segundos.

    terça-feira, 8 de dezembro de 2020 22:37
  • Bom dia,

    Então acho que não é necessário utilizar o operador Like, acho que você pode utilizar o sinal de igual e com ele você deve ter um desempenho melhor.


    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 9 de dezembro de 2020 13:42
  • Bom dia,

    Sim, troquei os like por =, coloquei indices na tabela e nada, continua do msm jeito, vou continuar pesquisando, de qualquer forma mto obrigado, pela ajuda amigo.

    :)

    quinta-feira, 10 de dezembro de 2020 15:15