J'ai un processus avec un Select qui prend beaucoup de temps à se terminer, de l'ordre de 5 à 10 minutes.
Je n'utilise actuellement pas NOLOCK comme indice pour le moteur de base de données MS SQL.
En même temps, nous avons un autre processus effectuant des mises à jour et des insertions dans la même base de données et les mêmes tables.
Le premier processus a commencé, récemment pour se terminer prématurément avec un message
SQLEXCEPTION: La transaction a été bloquée sur les ressources de verrouillage avec un autre processus et a été choisie comme victime du blocage.
Ce premier processus s'exécute sur d'autres sites dans des conditions identiques mais avec des bases de données plus petites et donc l'instruction de sélection en question prend un laps de temps beaucoup plus court (de l'ordre de 30 secondes environ). Dans ces autres sites, je ne reçois pas le message de blocage dans ces autres sites. Je n'ai pas non plus reçu ce message sur le site qui rencontre le problème au départ, mais, je suppose, à mesure que la base de données s'est agrandie, je pense que j'ai dû franchir un certain seuil. Voici mes questions:
- Le temps nécessaire à l'exécution d'une transaction pourrait-il rendre le processus associé plus susceptible d'être signalé comme victime d'un blocage.
- Si j'exécute la sélection avec un indice NOLOCK, est-ce que cela résoudra le problème?
- Je soupçonne qu'un champ datetime qui est vérifié dans le cadre de la clause WHERE dans l'instruction select provoque le temps de recherche lent. Puis-je créer un index basé sur ce champ? Est-ce conseillé?