MELHORAR DESEMPENHO AO CARREGAR DADOS

CELIOCANTALICE 03/02/2013 00:27:41
#418659
Olá galera,
Venho até vocês com o intuito de buscar uma solução para um problema que tenho enfrentado com uma aplicação que esteou desenvolvendo e que servirá de base para todas as demais. Eis o que se segue:

Após validação do acesso (win form) o usuário é direcionado para sua tela com acesso as suas opções, mas nessa tela existem na barra de status alguns totalizadores, que demostram quantidades de clientes cadastrados, valores de metas de vendas, posições de vendedores(setores) e outros dados que são buscados em um banco MySQL. O problema é que acredito que estes dados estejam causando um atraso na exibição do aplicativo que deveria ser imediato após o login já que o banco de dados é local. Este atraso varia entre 5 a 15 segundos dependendo do computador em uso, causando a impressão de que nada aconteceu após o login.
Então a minha pergunta é:
Como melhorar a performance de resposta do banco de dados ou do próprio aplicativo de forma que isto não mais aconteça.
Muito obrigado a todos.

Att,
Celio Cantalice.
ALTAIR148 03/02/2013 07:45:11
#418664
Bom dia,

Já tive um problema bem parecido com esse, no servidor rodava até bem, mas nas estações era muito lento, então ai passei a usar Stored Procedures e tive uma melhora de 100% de performance.
KURTGU 03/02/2013 15:11:57
#418671
SE NADA Parece estar acontecendo apos o login use um progressbar para informar ao usuario que esta carregando, os dados ou entao faca que nem o Altair falou procure sobre procedures...
JABA 03/02/2013 23:23:04
#418679
Existem algumas coisas que podem ajudar sim. Você pode melhorar a forma como os dados estão vindo. Use o DataReader quando necessario e procure verificar se o codigo está feito de maneira apropriada. Não é necessário o uso de um DataSet ou DataTable quando se trata de retornar registros com Count, Max, Min na sql.

Usar o pool de conexao tambem pode te ajudar. Veja se isso aqui te ajuda:

http://www.macoratti.net/09/06/vbn_upc.htm

vlw



CELIOCANTALICE 04/02/2013 10:34:30
#418696
Citação:

:
Bom dia,

Já tive um problema bem parecido com esse, no servidor rodava até bem, mas nas estações era muito lento, então ai passei a usar Stored Procedures e tive uma melhora de 100% de performance.


Amigo, o sistema foi todo concebido sob Storeds Procedures, com exceção desta parte onde trago os totalizadores.


Citação:

Existem algumas coisas que podem ajudar sim. Você pode melhorar a forma como os dados estão vindo. Use o DataReader quando necessario e procure verificar se o codigo está feito de maneira apropriada. Não é necessário o uso de um DataSet ou DataTable quando se trata de retornar registros com Count, Max, Min na sql.



Como disse acima, a parte que realiza as somas do sistema não utilizam dataset/reader. segue abaixo arotima utilizada para tal:
funcoes.conecta() [ô]função responsável por abrir a conexao
Dim sqlcli = [Ô]SELECT COUNT(*) as cli FROM clientes WHERE ativaCli=[ô]1[ô][Ô]
comando = New MySqlCommand(sqlcli, conexao)
Dim intCLi As Integer = comando.ExecuteScalar
tcli = String.Format([Ô]Temos {0} clientes cadastrados.[Ô], intCLi)
OCELOT 04/02/2013 11:39:21
#418700
Me parece que você tem várias consultas ai, então você já conferiu cada uma das consultas independente da outra para descobrir qual delas estão deixando o processo lento?

Outra alternativa que você pode considerar é fazer isso de forma assíncrona, assim você deixa o forma abrir mesmo que o resultado demore um pouco para aparecer, a hora que o resultado estiver pronto você mostra na barra de status, você poderia até colocar algo na barra de status para indicar que está atualizando os valores.

Existem várias formas de fazer isso, pode ser com um Thread, o que é mais complicado ou pode-se usar uma das muitas bibliotecas do .Net que facilitam o uso de Threads como o ThreadPool.QueueUserWorkItem, Task.Factory.StartNew, BackGroundWorker, se for o 4.5 pode usar ainda o async/await que é mais o fácil depois que se entende como ele funciona
CELIOCANTALICE 04/02/2013 11:59:12
#418704
já havia pensado em usar um thread para executar estes calculos em segundo plano mas temo pela estabilidade do sistema já que estes resultados são atualizados por um timer, porque este aplicativo roda como servidor com clientes espalhados por todo estado. (Antes que digam, não é lentidão do servidor por causa do numero de acessos ou da conexao com internet. Esse recurso só será implantado após a fase de codificação completa e os devidos testes) De forma que quando um usuário altere o valor de um totalizador está esteja visivel a todos.

Acompanhando a lógico do amigo OCELOT então eu teria que trabalhar com backgroundworker, exibindo para o cliente uma progressbar enquanto atualizo. Daí fico pensando no timer chamando a rotina de background acada 1 segundo isso vai dar certo?
JABA 04/02/2013 12:12:11
#418706
O 1ª passo a se fazer é identificar quais as consultas que estão trazendo mais registros e deixando a aplicação lenta.
O 2ª passo é verificar se todos os campos dessas consultas são realmente necessários. Caso contrário, traga somente os campos necessários.
O 3ª passo é tentar implementar o Pool de conexao.
O 4ª passo é implementar, se possivel, essas consultas por stored procedure.

acho que isso já melhora bastante coisa.

vlw
FOXMAN 04/02/2013 12:43:22
#418710
Amigo, recomendo o seguinte :
1 - Execute estas ações apenas após carregar o form em que será exibido os dados.
2 - Exiba o formulário e somente depois vc carrega as infos. De qualquer forma é necessário uma informação ao usuário.
3 - Otimize as SPs ou SQLs de forma a utilizar JOINs e proporcionar apenas uma leitura dos dados.
4 - Evite utilizar carregamentos de dados no Load dos forms, deixe essa função apenas para a montagem condicional do formulário.





Faça seu login para responder