CONSULTAS NO SQL SERVER 2008 E VB6 MUITO LENTA

SEBASTIAOFREITA 20/02/2015 11:34:08
#444637
Ola a todos!

Ultimamente venho sofrendo com minhas consultas e peço ajuda a voces para tentar melhorar o desempenho das mesmas. Tenho um servidor com windows server 2008 + ms sql server 2008 r2 em uma maquina com processsador i7, hd de 1 tera e ram de 8 gb. Minha aplicacao é em vb6 e uso ADO pra manipulação de dados. O banco tem +- 2,3 gb, quando entro na minha aplicacao em 3 maquinas pela rede já comeca o gargalo. Por exemplo, tenho uma tabela de vendas com cerca de 1 milhao de registros, no meu form apresento a lista de vendas num listview, sendo que ao informar um periodo de 1 mes, que retorna cerca de 7000 linhas, leva + de 1 minuto para aparecer no lista as vendas. Segue codigo de como faco as consultas:

1) Abro a conexao com o banco no inicio da aplicacao e so a fecho no final:

cnGestao.Open [Ô]Provider=sqloledb;Data Source=[Ô] & strDados & [Ô]\SVRINST01;Initial Catalog=BDInventer;User Id=suporte;Password=1234;[Ô]

cnGestao.CommandTimeout = 0

2) No meu form de consulta de vendas, exibo as mesmas num listview, trazendo somente 3 colunas da tabela:

rs.Open [Ô]SELECT ChvPed, DtEntrega, NomeCliente, TotalNota, Situacao[Ô] & _
[Ô] FROM tbVendas WHERE tbVendas.ChvPed>[Ô] & 0 & strCons & strCons2 & [Ô] ORDER BY ChvPed[Ô], cnGestao

Do While Not rs.EOF

Set NewItem = lstVendas.ListItems.Add(, rs([Ô]ChvPed[Ô]) & [Ô]x[Ô], rs([Ô]ChvPed[Ô]))
NewItem.SubItems(1) = rs([Ô]DtEntrega[Ô])
NewItem.SubItems(2) = [Ô][Ô] & rs([Ô]NomeCliente[Ô])
NewItem.SubItems(3) = Format(rs([Ô]TotalNota[Ô]), [Ô]###,##0.00[Ô])
NewItem.SubItems(4) = rs([Ô]Situacao[Ô])
rs.MoveNext
Loop
rs.Close
Set rs = Nothing

observacao: na conuslta SELECT o strCons contem o filtro por periodo, tipo:

strCons = [Ô] AND ( CONVERT(DATETIME,DtEntrega,101) BETWEEN CONVERT(DATETIME, [ô][Ô] & strData1 & [Ô][ô],101) AND CONVERT(DATETIME,[ô][Ô] & strData2 & [Ô][ô],101) )[Ô]


O que ja tentei e faco:

1) Diminuir o banco atraves da redução no sql management

2) Periodicamente ja faco uma manutencao apagando alguns dados que nao sao mais uteis, so que as vendas nao posso apgar

3) Diminuir a quantidade de campos a serem exibidos no listview(trago somente 3 colunas)

Como posso melhorar o desempenho nessa situacao descrita acima? esses testes foram feitos com apenas 3 computadores em rede, sendo que se eu executar a aplicacao no proprio servidor (local) ele fica lento. Até mesmo quando entro no SQL MANAGEMENT e faco uma query q retorne essa quantidade de dados fica lento como se estivesse travado.

Fico grato a todos que possam compartilhar suas experiencias.

Sebastiao freitas
F001E 20/02/2015 13:54:45
#444647
Bom se no SQL Management que está no próprio servidor fica lento, esse Servidor está com algum problema. E tive o mesmo problema de lentidão até descobrir que era o Servidor mas o que eu fiz para descobrir ? Dá um certo trabalho mas para descobrir que era realmente o servidor eu instalei o SQL Server em outra máquina, fiz essa máquina de servidor de teste e a aplicação rodou como um Raio. O problema é você restaurar 2,3GB de banco de dados mas no caso você cria a base de dados no novo servidor e copia somente os .mdf do seu servidor antigo para o novo.
MESTRE 20/02/2015 15:37:23
#444650
Citação:

Abro a conexao com o banco no inicio da aplicacao e so a fecho no final:



Abre a conexão no inicio da aplicação e so fecha no final do programa?? não deixa ela aberta o tempo todo não, quando for executar a query abra a conexão e depois feche-a
SEBASTIAOFREITA 21/02/2015 00:52:18
#444662
Citação:

:
Bom se no SQL Management que está no próprio servidor fica lento, esse Servidor está com algum problema. E tive o mesmo problema de lentidão até descobrir que era o Servidor mas o que eu fiz para descobrir ? Dá um certo trabalho mas para descobrir que era realmente o servidor eu instalei o SQL Server em outra máquina, fiz essa máquina de servidor de teste e a aplicação rodou como um Raio. O problema é você restaurar 2,3GB de banco de dados mas no caso você cria a base de dados no novo servidor e copia somente os .mdf do seu servidor antigo para o novo.



mas ja reinstalei em 2 maquinas diferentes, reinstalei o windows server + sql novamente e continua a mesma lentidão. Voce sabe dizer se teria algum servico no sql server 2008 que fizesse ele ficar lento?
SEBASTIAOFREITA 21/02/2015 00:54:29
#444663
Citação:

:
Abro a conexao com o banco no inicio da aplicacao e so a fecho no final:

Abre a conexão no inicio da aplicação e so fecha no final do programa?? não deixa ela aberta o tempo todo não, quando for executar a query abra a conexão e depois feche-a



Ve so, voce sugere eu abrir e fechar cada vez que faco um requisicao no servidor? nao vai ficar mais demorado ja que a aplicacao vai ficar abrindo e fechando o tempo todo? voce tem conseguido nas suas aplicacoes melhor desempenho assim?
LAMPIAO 21/02/2015 02:35:47
#444666
Olá Sebastião, faça um Shrink e marque a opção pra reorganizar os arquivos, o campo ChvPed, se não for um índice ou não tiver um índice, crie um pra esse campo e faça o teste, os campos data também, outra coisa é o retorno, o usuário vai querer mesmo ver 7000 linhas, limite o retorno, por exemplo SELECT TOP 1000, ou diminua o intervalo. Tenho banco de dados rodando em maquinas muito menos potente do que você falou que tá usando e não tem problemas de desempenho.

Se ainda assim o problemas persistir, ai pode ser algo na própria tabela, geralmente isso tem haver com índices no campo, você pode excluir e recriar um novo índice. Há várias coisas que podem ser feitas dependem do cenário, dos relacionamentos, enfim é um trabalho chato de fazer.

Abraços
SEBASTIAOFREITA 21/02/2015 03:15:49
#444667
Citação:

:
Olá Sebastião, faça um Shrink e marque a opção pra reorganizar os arquivos, o campo ChvPed, se não for um índice ou não tiver um índice, crie um pra esse campo e faça o teste, os campos data também, outra coisa é o retorno, o usuário vai querer mesmo ver 7000 linhas, limite o retorno, por exemplo SELECT TOP 1000, ou diminua o intervalo. Tenho banco de dados rodando em maquinas muito menos potente do que você falou que tá usando e não tem problemas de desempenho.

Se ainda assim o problemas persistir, ai pode ser algo na própria tabela, geralmente isso tem haver com índices no campo, você pode excluir e recriar um novo índice. Há várias coisas que podem ser feitas dependem do cenário, dos relacionamentos, enfim é um trabalho chato de fazer.

Abraços



todas as tabelas tem indice. nao tinha atentado ainda pra recria-los e vou fazer isto. apesar de ja ter uasdo o sherink.
Outra coisa, gostaria de saber se abrir e fechar a conexao com o banco é uma boa prática, pois ao contrário sempre abri e fechei somente no final. Como voces fazem?

MESTRE 21/02/2015 15:03:11
#444673
Citação:

Ve so, voce sugere eu abrir e fechar cada vez que faco um requisicao no servidor? nao vai ficar mais demorado ja que a aplicacao vai ficar abrindo e fechando o tempo todo? voce tem conseguido nas suas aplicacoes melhor desempenho assim?



Cara consegui uma melhora expressiva no desempenho assim.. da uma olhada no link e mais uma dica, evite o Sql = [Ô]SELECT *[Ô], ja peguei varios vezes onde o cara precisa apenas de 2 campos e da um select * sem necessidade..

Conexões ADO.NET
As conexões com os banco de dados são geralmente uma preocupação tardia, o que é surpreendente se considerarmos como elas são essenciais e como podem se tornar facilmente uma fonte de problemas e gargalos. Uma maneira de reduzir o número de conexões e o uso concomitante de seus recursos consiste em reutilizar as conexões por meio do pool de conexões. Para ser capaz de reutilizar uma conexão a partir de um pool, a string de conexão precisa corresponder à string de uma conexão de pool disponível. Cada pool de conexão é associado a uma string de conexão distinta, usando um algoritmo de correspondência exata. Se nenhuma correspondência exata for encontrada, será criada uma nova conexão, a qual será posteriormente incluída no pool.

da uma lida nos links:

http://www.microsoft.com/brasil/msdn/Tecnologias/adonet/DadosADONETSQL.mspx
https://msdn.microsoft.com/pt-br/library/8xx3tyca(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-2


SEBASTIAOFREITA 22/02/2015 10:45:48
#444678
Citação:

:
Ve so, voce sugere eu abrir e fechar cada vez que faco um requisicao no servidor? nao vai ficar mais demorado ja que a aplicacao vai ficar abrindo e fechando o tempo todo? voce tem conseguido nas suas aplicacoes melhor desempenho assim?

Cara consegui uma melhora expressiva no desempenho assim.. da uma olhada no link e mais uma dica, evite o Sql = [Ô]SELECT *[Ô], ja peguei varios vezes onde o cara precisa apenas de 2 campos e da um select * sem necessidade..

Conexões ADO.NET
As conexões com os banco de dados são geralmente uma preocupação tardia, o que é surpreendente se considerarmos como elas são essenciais e como podem se tornar facilmente uma fonte de problemas e gargalos. Uma maneira de reduzir o número de conexões e o uso concomitante de seus recursos consiste em reutilizar as conexões por meio do pool de conexões. Para ser capaz de reutilizar uma conexão a partir de um pool, a string de conexão precisa corresponder à string de uma conexão de pool disponível. Cada pool de conexão é associado a uma string de conexão distinta, usando um algoritmo de correspondência exata. Se nenhuma correspondência exata for encontrada, será criada uma nova conexão, a qual será posteriormente incluída no pool.

da uma lida nos links:

http://www.microsoft.com/brasil/msdn/Tecnologias/adonet/DadosADONETSQL.mspx
https://msdn.microsoft.com/pt-br/library/8xx3tyca(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-2





Valeu pela dica Vou dar uma olhada e ver como implementar.

grato.
Faça seu login para responder