Ho un processo con una selezione che richiede molto tempo per terminare, nell'ordine da 5 a 10 minuti.
Al momento non sto utilizzando NOLOCK come suggerimento per il motore di database MS SQL.
Allo stesso tempo abbiamo un altro processo che esegue aggiornamenti e inserimenti nello stesso database e nelle stesse tabelle.
Il primo processo è iniziato, recentemente terminato prematuramente con un messaggio
SQLEXCEPTION: la transazione è stata bloccata sulle risorse di blocco con un altro processo ed è stata scelta come vittima del deadlock.
Questo primo processo è in esecuzione su altri siti in condizioni identiche ma con database più piccoli e quindi l'istruzione select in questione richiede un periodo di tempo molto più breve (dell'ordine di 30 secondi circa). In questi altri siti, non ricevo il messaggio di deadlock in questi altri siti. Inoltre, non ho ricevuto questo messaggio sul sito che presenta il problema inizialmente, ma, presumo, poiché il database è cresciuto, credo di aver superato una certa soglia. Ecco le mie domande:
- Il tempo necessario per l'esecuzione di una transazione potrebbe aumentare le probabilità che il processo associato venga contrassegnato come vittima di deadlock.
- Se eseguo la selezione con un suggerimento NOLOCK, questo rimuoverà il problema?
- Sospetto che un campo datetime controllato come parte della clausola WHERE nell'istruzione select stia causando il tempo di ricerca lento. Posso creare un indice basato su questo campo? È consigliabile?