Tenho um processo com Select que demora muito para terminar, da ordem de 5 a 10 minutos.
No momento, não estou usando o NOLOCK como uma dica para o mecanismo de banco de dados MS SQL.
Ao mesmo tempo, temos outro processo fazendo atualizações e inserções no mesmo banco de dados e nas mesmas tabelas.
O primeiro processo começou, recentemente para terminar prematuramente com uma mensagem
SQLEXCEPTION: A transação foi travada em recursos de bloqueio com outro processo e foi escolhida como a vítima de impasse.
Este primeiro processo está sendo executado em outros sites em condições idênticas, mas com bancos de dados menores e, portanto, a instrução select em questão leva um período de tempo muito mais curto (da ordem de 30 segundos ou mais). Nesses outros sites, não recebo a mensagem de deadlock nesses outros sites. Também não recebi essa mensagem no site que está tendo o problema inicialmente, mas, presumo que, à medida que o banco de dados cresceu, acredito que devo ter ultrapassado algum limite. Aqui estão minhas perguntas:
- O tempo que leva para uma transação ser executada pode tornar o processo associado mais provável de ser sinalizado como uma vítima de deadlock.
- Se eu executar o select com uma dica NOLOCK, isso removerá o problema?
- Suspeito que um campo datetime que é verificado como parte da cláusula WHERE na instrução select está causando o tempo de pesquisa lento. Posso criar um índice com base neste campo? É aconselhável?