Usuário com melhor resposta
Consulta em banco a partir do sistema demorada

Pergunta
-
Boa noite caros colegas, tenho uma classe que realiza um crud. Tal classe funciona perfeitamente no SQL Server, ou seja, a performance no SQL Server é consideravelmente boa, visto que desenvolvi a mesma para trabalhar em ambiente web. Porem, precisei adequar esta classe para conexão com o banco Mysql, porem o desempenho dela piorou cerca de 200%.
Por exemplo:
Tenho uma tabela para fins de teste cujo a mesma tem alguns nomes de usuários. Há exatamente 15 registros simbólicos nesta tabela, porem se eu fizer um select * from usuario nesta tabela, o sistema demora em media de 2.43 segundos para retornar esses 15 registros.
Alguém pode me dar alguma dica para melhorar esta performance???
Detalhe, realizei estes testes em 2 servidores de bancos de dados diferentes.
1º Servidor: Core i5 2.4Ghz 6GB de Ram.
2º Servidor: Core 2 2.8Ghz Duo 4Gb de Ram
--Segue a classe
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml;
namespace ComandoMySQL
{
public class db
{
public string Server;
public string Database ;
public string Uid;
public string Pwd ;
public string Encrypt ;
public string Port;
public List<db> RetornarDB()
{
List<db> list = new List<db>();
db _db = null;
try
{
XmlDocument document = new XmlDocument();
document.Load(Directory.GetCurrentDirectory() + "\\config.xml");
XmlNodeList _xmlreader = document.GetElementsByTagName("connection");
foreach (XmlNode ob in _xmlreader)
{
_db = new db();
_db.Server = ob["Server"].InnerText;
_db.Database = ob["Database"].InnerText;
_db.Uid = ob["Uid"].InnerText;
_db.Pwd = ob["Pwd"].InnerText;
_db.Encrypt = ob["Encrypt"].InnerText;
_db.Port = ob["Port"].InnerText;
list.Add(_db);
}
return list;
}
catch (XmlException ex)
{
throw ex;
}
}
}
}---------------------------------------------------------------------------------------
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Data;
using System.Text;
namespace ComandoMySQL
{
/// <summary>
/// Classe Responsavel por manipular dados do MySQL.
/// </summary>
public class ComandoMySQL
{
string conexaoBD = null;
MySqlCommand cmd = null;
MySqlConnection cnn = null;
MySqlDataReader dr = null;
IDataReader IReader = null;
MySqlDataAdapter da = null;
DataSet ds = null;
DataTable dt = null;
/// <summary>
/// Função que realiza a conexao com o banco de dados
/// </summary>
public void MontarSringSQL()
{
db _db = new db();
foreach (db ob in _db.RetornarDB())
{
conexaoBD = "Server=" + ob.Server + ";" +
"Port=" + ob.Port + ";" +
"Database=" + ob.Database + ";" +
"Uid=" + ob.Uid + ";" +
"Pwd=" + ob.Pwd + ";";
//conexaoBD = "Data Source=" + nomeServidorBancoDados + "\\" + nomeInstanciaBancoDados + ";Initial Catalog=" + nomeBancoDados + ";Persist Security Info=True;User ID=" + nomeUsuarioBancoDados + ";Password=" + senhaBancoBancoDados;
}
}
/// <summary>
/// Construtor vazio
/// </summary>
public ComandoMySQL()
{
}
/// <summary>
/// Realiza abertura do Banco de dados
/// </summary>
/// <returns>Retorna um elemento do tipo SqlConnection cotendo os dados da conexao</returns>
private MySqlConnection AbrirBanco()
{
try
{
MontarSringSQL();
cnn = new MySqlConnection(conexaoBD);
cnn.Open();
}
catch (MySqlException ex)
{
throw ex;
}
return cnn;
}
private void DestruirObjeto()
{
cmd.Dispose();
cnn.Dispose();
dr.Dispose();
IReader.Dispose();
da.Dispose();
ds.Dispose();
dt.Dispose() ;
}
/// <summary>
/// Realiza o fechamento seguro da conexao com o banco.
/// </summary>
/// <param name="cnn">Deve-se informar um parametro do tipo SqlConnection</param>
private void FecharBanco(MySqlConnection cnn)
{
if (cnn.State == ConnectionState.Open)
try
{
cnn.Close();
//DestruirObjeto();
}
catch (MySqlException ex)
{
throw ex;
}
}
/// <summary>
/// Método que executa os comandos em SQL, como Select Insert, Update, Delete
/// </summary>
/// <param name="sql">Passa-se uma string no formato em SQL ( {Insert into}--{Update set}--{Delete from}</param>
/// <returns>Retorna-se um elemento do tipo SqlCommand</returns>
private MySqlCommand ExecutarSQL(string sql)
{
//Tratamento de erros
try
{
cnn = AbrirBanco();
cmd = new MySqlCommand();
cmd.Connection = cnn;
cmd.CommandText = sql.ToString();
//cmd.CommandType = CommandType.Text;
}
//Caso ocorra algum erro, o metodo catch irá informar qual o erro
catch (MySqlException ex)
{
//Retorna o erro apontado
throw ex;
}
return cmd;
}
/// <summary>
/// Método que executa os comandos em SQL, como Insert, Update, Delete
/// </summary>
/// <param name="sql">Passa-se uma string no formato em SQL ( {Insert into}--{Update set}--{Delete from}</param>
public void SQL(string sql)
{
if (sql != string.Empty)
{
try
{
ExecutarSQL(sql).ExecuteNonQuery();
}
catch (MySqlException ex)
{
throw ex;
}
finally
{
FecharBanco(cnn);
}
}
}
/// <summary>
/// Método que realiza consultas no banco de dados e retorna os resultados para o formulário
/// </summary>
/// <param name="sql">Passa-se uma string no formato em SQL </param>
/// <returns>Retorna-se um elemento do tipo DataSet</returns>
public DataSet RetornarDataSet(string sql)
{
if (sql != string.Empty)
{
try
{
//Passa como paramentro a função que realiza a execução das querys.
da = new MySqlDataAdapter(ExecutarSQL(sql));
//Inicializa o DataSet
ds = new DataSet();
//Passa para o SqlDataAdapter o DataSet como Paramentro
da.Fill(ds);
}
catch (MySqlException ex)
{
throw ex;
}
finally
{
FecharBanco(cnn);
}
}
//Retorna para o Metodo invocador o DataSet Montado
return ds;
}
/// <summary>
/// Método que realiza consultas no banco de dados e retorna os resultados para o formulário
/// </summary>
/// <param name="sql">Passa-se uma string no formato em SQL </param>
/// <returns>>Retorna-se um elemento do tipo DataTable</returns>
public DataTable RetornarDataTable(string sql)
{
if (sql != string.Empty)
{
try
{
dt = new DataTable();
da = new MySqlDataAdapter(ExecutarSQL(sql));
da.Fill(dt);
}
catch (MySqlException ex)
{
throw ex;
}
finally
{
FecharBanco(cnn);
}
}
return dt;
}
/// <summary>
/// Método que realiza consultas no banco de dados e retorna os resultados para o formulário
/// </summary>
/// <param name="sql">Passa-se uma string no formato em SQL </param>
/// <returns>Retorna-se um elemento do tipo IDataReader</returns>
public IDataReader RetornarIDataReader(string sql)
{
if (sql != string.Empty)
{
try
{
//Passa para o IReader o resultado da consulta SQL
IReader = ExecutarSQL(sql).ExecuteReader();
}
catch (Exception ex)
{
throw ex;
}
}
//Retorna para o Metodo invocador o DataSet Montado
return IReader;
}
}
}
Respostas
-
@Nelson_lucas
Verefiquei o teu codigo....
Porque isto: public IDataReader RetornarIDataReader(string sql)?
Voce tem interface? So se usa IDataReader quando se programa com interface.
Usa-se interface quando se programa em groupo...fica facil de "honrar o contracto"...
Tu tens muitos codigos a fazer a mesma coisa....Tu esta a programar em camadas( N-tier)?
A flower cannot blossom without sunshine, and man cannot live without love.
- Marcado como Resposta Marcos SJ quinta-feira, 5 de novembro de 2015 15:40
-
Quando voce usa sqlserver quanto tempo leva pra trazer a informacao?
Pode ser problema relacionado com MySqlserver e nao com o teu codigo...
A flower cannot blossom without sunshine, and man cannot live without love.
- Marcado como Resposta Marcos SJ quinta-feira, 5 de novembro de 2015 15:40
-
Muda este codigo
private void FecharBanco(SqlConnection cnn)
{
if (AbrirBanco().State == ConnectionState.Open)
try
{
AbrirBanco().Close();
}
catch (SqlException ex)
{
throw ex;
}
}
A flower cannot blossom without sunshine, and man cannot live without love.
-
Amigo ao retornar o datatable desabilite as Constraints
sua_data_table.EnforceConstraints = false;
Dessa forma ira o sistema não irá fazer as validações da chaves e terá um load mais rápido!
*****************************************************
Rafael Almeida Programador Sênior - JAMSOFT Sistemas
rafaelalmeida@jamsoft.com.br
www.jamsoft.com.br
*****************************************************
Asp.Net 5 Vnext, C# 6, Entity Framework e SQL Server
*****************************************************- Marcado como Resposta Levi DomingosModerator domingo, 8 de novembro de 2015 11:48
-
A forma em que tu programa ja nao se usa muito...
Troca isto pra isto:
MySqlCommand cmd {get; set;}
MySqlConnection cnn {get; set;}
MySqlDataReader dr {get; set;}
MySqlDataAdapter {get; set;}
DataSet ds {get; set;}
DataTable dt {get; set;}este codigo deveria usar Using
private MySqlCommand ExecutarSQL(string sql)
{
//Tratamento de erros
try
{Using (
codigo aki
) }
//Caso ocorra algum erro, o metodo catch irá informar qual o erro
catch (MySqlException ex)
{
//Retorna o erro apontado
throw ex;
}
return cmd;
}Acho que a tua conecao atrasa...
A flower cannot blossom without sunshine, and man cannot live without love.
- Marcado como Resposta Nelson_lucas quarta-feira, 11 de novembro de 2015 23:30
-
Amigo ao retornar o datatable desabilite as Constraints
sua_data_table.EnforceConstraints = false;
Dessa forma ira o sistema não irá fazer as validações da chaves e terá um load mais rápido!
*****************************************************
Rafael Almeida Programador Sênior - JAMSOFT Sistemas
rafaelalmeida@jamsoft.com.br
www.jamsoft.com.br
*****************************************************
Asp.Net 5 Vnext, C# 6, Entity Framework e SQL Server
*****************************************************
Opa, aceito sua dica!!!
Pessoal, problema resolvido, as dicas acima foram utilizadas e fico agradecido pela ajuda.
Problema: Lentidão ao realizar consultas
Solução:
1º - Upgrade no banco de dados. A versão instalada era a Mysql v5.5 e foi atualizada para 5.7.
2º Alteração do collation da base de dados que se encontrava errada.
Apos estas alterações, as consultas estão retornando em 0.231 s.
Muito obrigado pelas dicas e pelo empenho em ajudar pessoal. Fica a dica: "Ao criar uma base de dados, verifiquem o collation pois isso influencia muito na questão de desempenho."
- Marcado como Resposta Marcos SJ sexta-feira, 13 de novembro de 2015 13:30
Todas as Respostas
-
@Nelson_lucas
Verefiquei o teu codigo....
Porque isto: public IDataReader RetornarIDataReader(string sql)?
Voce tem interface? So se usa IDataReader quando se programa com interface.
Usa-se interface quando se programa em groupo...fica facil de "honrar o contracto"...
Tu tens muitos codigos a fazer a mesma coisa....Tu esta a programar em camadas( N-tier)?
A flower cannot blossom without sunshine, and man cannot live without love.
- Marcado como Resposta Marcos SJ quinta-feira, 5 de novembro de 2015 15:40
-
-
Quando voce usa sqlserver quanto tempo leva pra trazer a informacao?
Pode ser problema relacionado com MySqlserver e nao com o teu codigo...
A flower cannot blossom without sunshine, and man cannot live without love.
- Marcado como Resposta Marcos SJ quinta-feira, 5 de novembro de 2015 15:40
-
Muda este codigo
private void FecharBanco(SqlConnection cnn)
{
if (AbrirBanco().State == ConnectionState.Open)
try
{
AbrirBanco().Close();
}
catch (SqlException ex)
{
throw ex;
}
}
A flower cannot blossom without sunshine, and man cannot live without love.
-
Muda este codigo
private void FecharBanco(SqlConnection cnn)
{
if (AbrirBanco().State == ConnectionState.Open)
try
{
AbrirBanco().Close();
}
catch (SqlException ex)
{
throw ex;
}
}
A flower cannot blossom without sunshine, and man cannot live without love.
-
Quando voce usa sqlserver quanto tempo leva pra trazer a informacao?
Pode ser problema relacionado com MySqlserver e nao com o teu codigo...
A flower cannot blossom without sunshine, and man cannot live without love.
Então, pela primeira analise que fiz, utilizei os mesmos servidores para este teste. A media de retorno dos registros foi em média de 0.393 segundos. o famoso "clicou e apareceu", rsrs.
Detalhe: Utilizei os mesmos registros contidos no mysql.
-
Este codigo pega a conecao?
public void MontarSringSQL()
{
db _db = new db();
foreach (db ob in _db.RetornarDB())
{
conexaoBD = "Server=" + ob.Server + ";" +
"Port=" + ob.Port + ";" +
"Database=" + ob.Database + ";" +
"Uid=" + ob.Uid + ";" +
"Pwd=" + ob.Pwd + ";";
//conexaoBD = "Data Source=" + nomeServidorBancoDados + "\\" + nomeInstanciaBancoDados + ";Initial Catalog=" + nomeBancoDados + ";Persist Security Info=True;User ID=" + nomeUsuarioBancoDados + ";Password=" + senhaBancoBancoDados;
}
}este codigo tambem:
public List<db> RetornarDB()
{
List<db> list = new List<db>();
db _db = null;
try
{
XmlDocument document = new XmlDocument();
document.Load(Directory.GetCurrentDirectory() + "\\config.xml");
XmlNodeList _xmlreader = document.GetElementsByTagName("connection");
foreach (XmlNode ob in _xmlreader)
{
_db = new db();
_db.Server = ob["Server"].InnerText;
_db.Database = ob["Database"].InnerText;
_db.Uid = ob["Uid"].InnerText;
_db.Pwd = ob["Pwd"].InnerText;
_db.Encrypt = ob["Encrypt"].InnerText;
_db.Port = ob["Port"].InnerText;
list.Add(_db);
}
return list;
}
catch (XmlException ex)
{
throw ex;
}
}
}
}podemos alterar, a demora pode estar ai...
A flower cannot blossom without sunshine, and man cannot live without love.
-
Este codigo pega a conecao?
public void MontarSringSQL()
{
db _db = new db();
foreach (db ob in _db.RetornarDB())
{
conexaoBD = "Server=" + ob.Server + ";" +
"Port=" + ob.Port + ";" +
"Database=" + ob.Database + ";" +
"Uid=" + ob.Uid + ";" +
"Pwd=" + ob.Pwd + ";";
//conexaoBD = "Data Source=" + nomeServidorBancoDados + "\\" + nomeInstanciaBancoDados + ";Initial Catalog=" + nomeBancoDados + ";Persist Security Info=True;User ID=" + nomeUsuarioBancoDados + ";Password=" + senhaBancoBancoDados;
}
}este codigo tambem:
public List<db> RetornarDB()
{
List<db> list = new List<db>();
db _db = null;
try
{
XmlDocument document = new XmlDocument();
document.Load(Directory.GetCurrentDirectory() + "\\config.xml");
XmlNodeList _xmlreader = document.GetElementsByTagName("connection");
foreach (XmlNode ob in _xmlreader)
{
_db = new db();
_db.Server = ob["Server"].InnerText;
_db.Database = ob["Database"].InnerText;
_db.Uid = ob["Uid"].InnerText;
_db.Pwd = ob["Pwd"].InnerText;
_db.Encrypt = ob["Encrypt"].InnerText;
_db.Port = ob["Port"].InnerText;
list.Add(_db);
}
return list;
}
catch (XmlException ex)
{
throw ex;
}
}
}
}podemos alterar, a demora pode estar ai...
A flower cannot blossom without sunshine, and man cannot live without love.
alterado para :
try
{
XmlDocument document = new XmlDocument();
document.Load(Directory.GetCurrentDirectory() + "\\config.xml");
XmlNodeList _xmlreader = document.GetElementsByTagName("connection");
foreach (XmlNode ob in _xmlreader)
{
conexaoBD = "Server=" + ob["Server"].InnerText + ";" +
"Port=" + ob["Port"].InnerText + ";" +
"Database=" + ob["Database"].InnerText + ";" +
"Uid=" + ob["Uid"].InnerText + ";" +
"Pwd=" + ob["Pwd"].InnerText + ";";
}
}
catch (XmlException ex)
{
throw ex;
}Realizei os teste msmo assim o tempo nao sai da media de 2.33.
Reparei um ponto muito interessante no momento de realizar a abertura do banco. Fiz um debbug do código, no ato de realizar a abertura ( "cn.open(); "), o VS dá uma travada, depois a abertura é realizada.
A string de conexao é gerada a patir de um XML
Vejam a estrutura dele
<connection>
<Server>localhost</Server>
<Port>3306</Port>
<Database>dbvenda</Database>
<Uid>root</Uid>
<Pwd>123</Pwd>
<Encrypt>true</Encrypt>
</connection>
-
Bom dia,
A pergunta inicial da thread já foi devidamente respondida?
Atenciosamente
Marcos Roberto de Souza Junior
Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
-
A forma em que tu programa ja nao se usa muito...
Troca isto pra isto:
MySqlCommand cmd {get; set;}
MySqlConnection cnn {get; set;}
MySqlDataReader dr {get; set;}
MySqlDataAdapter {get; set;}
DataSet ds {get; set;}
DataTable dt {get; set;}este codigo deveria usar Using
private MySqlCommand ExecutarSQL(string sql)
{
//Tratamento de erros
try
{Using (
codigo aki
) }
//Caso ocorra algum erro, o metodo catch irá informar qual o erro
catch (MySqlException ex)
{
//Retorna o erro apontado
throw ex;
}
return cmd;
}Acho que a tua conecao atrasa...
A flower cannot blossom without sunshine, and man cannot live without love.
- Marcado como Resposta Nelson_lucas quarta-feira, 11 de novembro de 2015 23:30
-
Notei que voce tem um metodo que retorna um Idatareader!
Nao e boa pratica de programacao, tu nunca deverias retornar um datareader mais sim uma lista.
Desta forma:
public List<Class1Aluno> testereader(string sql)
{
Aluno = new List<Class1Aluno>();
SqlDataReader r = ExecutarSQL(sql).ExecuteReader();
if (r.HasRows)
{
while (r.Read())
{
Aluno.Add(new Class1Aluno
{
Name = r[0].ToString(),
Adress = r[1].ToString(),
Age = r[2].ToString(),
ID = r[3].ToString()
});
}
}
r.Close();
return Aluno;
}A flower cannot blossom without sunshine, and man cannot live without love.
-
Bom dia,
A pergunta inicial da thread já foi devidamente respondida?
Atenciosamente
Marcos Roberto de Souza Junior
Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
Ainda não, mas creio que estamos próximos de descobrir a causa do problema.
att.
-
Notei que voce tem um metodo que retorna um Idatareader!
Nao e boa pratica de programacao, tu nunca deverias retornar um datareader mais sim uma lista.
Desta forma:
public List<Class1Aluno> testereader(string sql)
{
Aluno = new List<Class1Aluno>();
SqlDataReader r = ExecutarSQL(sql).ExecuteReader();
if (r.HasRows)
{
while (r.Read())
{
Aluno.Add(new Class1Aluno
{
Name = r[0].ToString(),
Adress = r[1].ToString(),
Age = r[2].ToString(),
ID = r[3].ToString()
});
}
}
r.Close();
return Aluno;
}
A flower cannot blossom without sunshine, and man cannot live without love.
- Editado Nelson_lucas sexta-feira, 6 de novembro de 2015 15:16 falta de complemento
-
-
Como esta a utilizar?
Posta aki o codigo...
Tu tens uma interface?
A flower cannot blossom without sunshine, and man cannot live without love.
Bom, ficaria similar ao código abaixo:
public List<pagina> RetornaPagina(){
ComandoSQL exec = new ComandoSQL();
Pagina p = null;
List<Pagina> list= new List<Pagina>();
string aSql = "Select codPag,nomPag,desPag, sitPag from Pagina";
IDataReader dr = exec.RetornaIDataReader(aSql);
while(dr.Read()){
p = new Pagina();
p.codPag = dr.getInt(0);
p.nomPag = dr.getString(1);
p.desPag = dr.getString(2);
p.sitPag = dr.getInt(3);
list.add(p);
}
return list;
}
-
-
Amigo ao retornar o datatable desabilite as Constraints
sua_data_table.EnforceConstraints = false;
Dessa forma ira o sistema não irá fazer as validações da chaves e terá um load mais rápido!
*****************************************************
Rafael Almeida Programador Sênior - JAMSOFT Sistemas
rafaelalmeida@jamsoft.com.br
www.jamsoft.com.br
*****************************************************
Asp.Net 5 Vnext, C# 6, Entity Framework e SQL Server
*****************************************************- Marcado como Resposta Levi DomingosModerator domingo, 8 de novembro de 2015 11:48
-
Amigo ao retornar o datatable desabilite as Constraints
sua_data_table.EnforceConstraints = false;
Dessa forma ira o sistema não irá fazer as validações da chaves e terá um load mais rápido!
*****************************************************
Rafael Almeida Programador Sênior - JAMSOFT Sistemas
rafaelalmeida@jamsoft.com.br
www.jamsoft.com.br
*****************************************************
Asp.Net 5 Vnext, C# 6, Entity Framework e SQL Server
*****************************************************
Opa, aceito sua dica!!!
Pessoal, problema resolvido, as dicas acima foram utilizadas e fico agradecido pela ajuda.
Problema: Lentidão ao realizar consultas
Solução:
1º - Upgrade no banco de dados. A versão instalada era a Mysql v5.5 e foi atualizada para 5.7.
2º Alteração do collation da base de dados que se encontrava errada.
Apos estas alterações, as consultas estão retornando em 0.231 s.
Muito obrigado pelas dicas e pelo empenho em ajudar pessoal. Fica a dica: "Ao criar uma base de dados, verifiquem o collation pois isso influencia muito na questão de desempenho."
- Marcado como Resposta Marcos SJ sexta-feira, 13 de novembro de 2015 13:30