locked
Boa Noite, Pessoal! Alguém poderia me ajudar? Motivo: Timeout expired RRS feed

  • Pergunta

  • Pessoal, Boa Noite!

    Em 1º lugar quero agradecê-los, pela ajuda que tenho recebido neste Forum.

    Porém, Senhores, mais uma vez solicito ajuda, pois estou com um grande problema. A base de dados do meu projeto é muito grande. Possuo uma Tabela que possui em torno de 2.300.000 registros. A principal pesquisa pelo site é consultar em um campo ntext, qualquer nome (string alfabética) através de um comando SELECT, que inclusive utilizo períodos de data que vão trocando para melhorar o tempo de resposta, conforme exemplo abaixo:

    "SELECT * FROM [Tabela] WHERE CampoData >= '" & variavelDataInicial & '" AND CampoData <= '" & variavelDataFinal & '" AND CHARINDEX('NOME', CampoNtext) > 0 ORDER BY CampoData"

    Porém dá o seguinte erro:

    Microsoft OLE DB Provider for SQL Server error '80040e31'
    Timeout expired
    /Pesquisa.asp, line 201

    Peço a ajuda dos Senhores, pois se não houver solução, inviabilizará o meu projeto.

    Agradeço a atenção dos Senhores.

    Att.


    Suceguedes.

     

    terça-feira, 21 de outubro de 2008 23:29

Todas as Respostas

  • Suceguedes,

     

    O seu problema esta no volume dos seus dados, por isso o SQL Server esta retornando a mensagem de time out!!!

     

    Você esta utilizando SQL Server 2000!!!

     

    Já pensou na possibilidade de separar esta table em outros, trabalhando como se fosse um particionamento de table e através de uma view fazer o acesso, ou então acessar diretamente esta table?

    quarta-feira, 22 de outubro de 2008 09:55
    Moderador
  • Boa Tarde,

     

    Certifique-se de que a coluna CampoData possua um índice.

    Se não existir crie-o, se existir desfragmente-o.

     

    Quantos registros você espera em média obter como resultado ?

     

    [ ]s,

     

    Gustavo

     

    quarta-feira, 22 de outubro de 2008 17:35
  • Maia,

     

    Você acredita que pode ser falta de índice ou desfragmentação?

     

    O que eu consegui entender é que o volume que esta sendo retornado no result set é muito pesado é o SQL Server esta gerando timeout.

     

    Concordo com a possibilidde de desfragmentação como também a criação de índices, mas acho também interessante a possibilidade de dividir um pouco o volume desta table para facilitar a busca de informações.

    quarta-feira, 22 de outubro de 2008 23:01
    Moderador
  • Oi Jr.

     

    A consulta dele tem dois filtros, um baseado em data e outro baseado no charindex. O uso do CHARINDEX é certo de desprezar qualquer índice existente então se a tabela é grande um TABLESCAN é inevitável.

     

    A esperança para uma consulta mais performática está na utilização das colunas de data. Se não houver índice sobre esses campos então o TABLESCAN é certo.

     

    Embora exista dois milhões de registros eu acredito que não devemos nos enganar com esse número. Primeiro porque não acredito que todos serão retornados. Segundo porque uma quantidade de dois milhões de registros não diz absolutamente nada. Se o registro tiver 100bytes (de repende existe apenas a coluna de nome, uma de ID e uma de data), teremos 80 registros por páginas e para comportar todos os registros teremos então 28750 páginas em um total de 230MB o que não é grande coisa... (claro que para retornar tudo é o suficiente para um timeout).

     

    Dividir é uma opção, mas trabalhar com Views Particionadas por exemplo vai envolver um overhead administrativo adicional. Acho que devemos esperar para ver como está a indexação antes de partir para essa alternativa.

     

    [ ]s,

     

    Gustavo

    quinta-feira, 23 de outubro de 2008 01:07
  • Maia,

     

    Certo, consegui entender o que você esta pensando!!!

     

    Em relação a quantidade de registro realmente não podemos se basear nestes valores, mas da maneira que ele postou eu entendi que o retorno estava muito alto.

    sexta-feira, 24 de outubro de 2008 09:36
    Moderador
  • Bom dia Suceguedes  pelo que vejo você está usando CHARINDEX  e o mesmo não pode ser usado com texto, ntext, imagem e tipos de dados.

     

    Tente usar PATINDEX no lugar de CHARINDEX se for este o caso.

     

    Modifique sua instrução para :

     

    "SELECT * FROM [Tabela] WHERE CampoData >= '" & variavelDataInicial & '" AND CampoData <= '" & variavelDataFinal & '" AND PATINDEX('%NOME%', CampoNtext) > 0 ORDER BY CampoData"

     

     

    sexta-feira, 24 de outubro de 2008 13:02
  • Caro Júnior, Boa Noite!

     

    Agradeço sua ajuda, separei o campo ntext em outra tabela com um campo código para o relacionamento.  Realmente funcionou, ficou mais rápido e resolveu o problema do timedout.

     

    Só mais um problema:  A resposta na página demora para aparecer, pois utilizo vários select's, um para cada período, dentro de um Do While, também para resolver o problema do Timedout.  Tem como após cada Select ir mostrando o resultado na página ?  Utilizar algum tipo de Refresh ?  Estou inclusive após a cada Select, fechando e abrindo o DB.

     

    Ficaria muito grato, se pudesse me ajudar também mais nessa.

     

    Abraço.

     

     

    Suceguedes.

    domingo, 26 de outubro de 2008 00:59
  • Prezado Gustavo, Boa Noite!

     

    Obrigado pela ajuda.  Passei a utilizar índices porém em um campo autonumeração que pesquiso a cada 20000 registros para resolver também o problema do Timedout e ficou bem rápido.

     

    Só mais um problema:  A resposta na página demora para aparecer, pois utilizo vários select's, um para cada 20000 registros, dentro de um Do While.  Tem como após cada Select ir mostrando o resultado na página ?  Utilizar algum tipo de Refresh ?  Estou inclusive após a cada Select, fechando e abrindo o DB.

     

    Ficaria muito grato, se pudesse me ajudar nessa.

     

    Abraço.

     

     

    Suceguedes.

    domingo, 26 de outubro de 2008 01:05
  • Alexandre, Boa Noite!

     

    Você tem razão!  O patindex é bem mais rápido.  Já o estou utilizando.

     

    Só mais um problema:  A resposta na página demora para aparecer, pois utilizo vários select's, um para cada 20000 registros, dentro de um Do While, também para resolver o problema do Timedout.  Tem como após cada Select ir mostrando o resultado na página ?  Utilizar algum tipo de Refresh ?  Estou inclusive após a cada Select, fechando e abrindo o DB.

     

    Ficaria muito grato, se pudesse me ajudar nessa também.

     

    Att.

     

     

    Suceguedes.

    domingo, 26 de outubro de 2008 01:13
  • Use também  suas instruções entre as instruções "begin tran" e "commit tran" depois "GO".

    Teste este exemplo abaixo em suas consultas:
    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
    GO
    BEGIN TRANSACTION;
    GO
    SELECT * 
        FROM xxx;
    GO
    SELECT * 
        FROM yyy;
    GO
    COMMIT TRANSACTION;
    GO
     
     
    Acredito que isto resolva o seu problema.
     
     
     
     
     
     
     
    segunda-feira, 27 de outubro de 2008 11:24