Array
(
)

Parando a execução de uma query em andamento

Danielnascimento
   - 30 jul 2004

estou com um grande problema em minha aplicação....
ps. utilizo SQL Server 2000 e minha aplicação é n-tier, utilizando com plus...

Tenho uma consulta bem considerável, que leva em torno de 20 minutos para
executar... e a sessão de minha página ASP expira em 15 minutos... porém o que ocorre...

como o relatório tem um tempo de execução maior do que o timeout do ISS para o usuário, o usuário não consegue visualizar o relatório, e sua sessão é derrubada, porém a consulta no banco ainda nao foi finalizada, e continua rodando no sgdb...

ai começam meus problemas.... tenho uma média de 80/90 usuarios logados em horario comercial, e toda vez que acontece este caso descrito acima fica um usuario preso no banco consumindo recurso...

entao o que eu gostaria...

sei que tenho como recurso fazer um ´Job´ para dar um kill no meu spid... mas não seria interessante enquanto regras de negócio para a aplicação...

gostariamos de implementar uma funcionalidade que quando o usuario tiver realizando uma consulta muito lenta, ele tenha a opção de cancelar esta, assim como nós desenvolvedores fazemos no query analizer... clicando no botãozinho Stop...

resumindo gostariamos de implementar esta funcionalidade no sistema...

vc poderia me ajudar... ou pelos menos falar se existe uma forma de faze-la...

Antecipadamente agradeço...

[]s
Daniel Nascimento

Daniela
   - 02 ago 2004

Porque vc nao aumenta o tempo de timeout de suas paginas em asp?

Você poderia fazer um estudo das tabelas envolvidas nesse processsamento pois e um tempo demasiamente longo provavelmente sera necessaria a criacao de indices nas tabelas e modificacoes para aumentar a velocidade de processamento.

Espero ter ajudado.

Marcus.magalhaes
   - 05 ago 2004

Daniel, boa tarde.

Não tem como vc fazer o q está querendo, pois uma vez q o servidor recebe o comando e somente faz a verificação da persistencia da conexão qdo da entrega do resultado, o Query Analyzer é uma ferramenta q interage com o banco fazendo o kill na conexão solicitada, porém, como vc não tem o id da conexão q está realizando o trabalho vc não pode dar um kill aleatório.

Tenho algumas sugestões:
1) caso existam dados q não são mais utilizados, vc pode mover-los para histórico ou fazer um backup da base apaga-los?;
2) Como a Daniela falou, verificar se os índices estão atendendo, vc consegue ver isso pelo execution plan do Query Analyzer.
3) Utilizar tabelas de memória para filtrar as tabelas envolvidas em JOINs mto pesados, ou seja, ao invés de utilizar a tabela original, faça o select filtrando-a e salvando o resultado em uma tbl temporaria, assim o resultado (que é o desejado) é menor e o join com a tbl temporaria é mais rápido, pq 20 min é um tempo inconcebivel para uma aplicação.

Att,