![Problema de disponibilidade do servidor SQL: consulta grande impede que outras conexões se conectem](https://rvso.com/image/515035/Problema%20de%20disponibilidade%20do%20servidor%20SQL%3A%20consulta%20grande%20impede%20que%20outras%20conex%C3%B5es%20se%20conectem.png)
Eu tenho um servidor de alta especificação (multicore, RAID) executando o MS SQL 2008, com vários bancos de dados nele. Tenho um processo de baixo rendimento que precisa periodicamente de uma pequena quantidade de informações de um dos bancos de dados e o código parece funcionar bem.
No entanto, às vezes, quando um de meus colegas faz uma consulta enorme em um dos outros bancos de dados, vejo o uso total da CPU na máquina e as conexões do meu aplicativo atingem o tempo limite.
Por que isso acontece? Eu teria pensado que os muitos núcleos e discos rígidos seriam de alguma forma (juntamente com um servidor de banco de dados habilmente escrito) capazes de manter pelo menos alguns dos recursos livres para outros aplicativos? Tenho certeza de que ele não usa múltiplas conexões para sua consulta.
O que posso fazer para evitar isso?
EDITAR
Não tenho muitos detalhes sobre o hardware. Ele usa HDDs comuns, raided, com Server 2k3. É um HP que talvez tenha alguns anos. Basicamente, não faz sentido para mim que o problema seja o hardware, então imaginei que poderia ter configurado algo errado.
Responder1
Isso significa que você tem uma consulta extremamente abaixo do ideal. Suspeitos habituais:
- índices inexistentes ou ruins
- funções em colunas na cláusula WHERE (= índices ignorados)
- conversões/precedência de tipo de dados (= índices ignorados)
- Udfs escalares com acesso à tabela em cláusulas SELECT (= efeito CURSOR)
- Visualizações consultando/JOINING com visualizações (uma visualização é uma macro que se expande)
Também pode ser um problema simples de recursos: os dados retornados tocam todo o banco de dados, de modo que ele usa muita memória para ser paginado? Ou você recebe esperas ASYNC_NETWORK_IO, o que pode significar que o cliente não está aceitando resultados tão rápido quanto deveria?
Geralmente, se você maximiza um servidor, então é um código e/ou design ruim, não o mecanismo de banco de dados.
Responder2
Contanto que você tenha certeza de que otimizou o máximo possível, convém verificar suas configurações de paralelismo; o padrão é usar todos os processadores para consultas paralelas, você pode alterá-lo para um número menor, dependendo do número de processadores que você possui, a consulta pode demorar um pouco mais para ser executada, mas deve deixar poder de processamento suficiente livre para solicitações de login de serviço. Se o problema estiver isolado nesta consulta, em vez de fazer uma alteração nas configurações de todo o sistema, você pode fazer com que seu colega altere sua consulta adicionando uma opção MAXDOP para ver se isso ajuda.