Je suppose que la vraie question est:
Si je ne me soucie pas des lectures modifiées, l'ajout de l'indicateur avec (NOLOCK) à une instruction SELECT affecte les performances de:
Exemple:
Select *
from aTable with (NOLOCK)
1) Oui, une sélection avec NOLOCK
se terminera plus rapidement qu'une sélection normale.
2) Oui, une sélection avec NOLOCK
permettra aux autres requêtes de la table concernée de se terminer plus rapidement qu'une sélection normale.
Pourquoi cela serait-il?
NOLOCK
généralement (selon votre moteur de base de données) signifie donnez-moi vos données, et je me fiche de l'état dans lequel elles se trouvent, et ne vous inquiétez pas de les conserver pendant que vous les lisez. Tout cela est à la fois plus rapide, moins gourmand en ressources et très dangereux.
Vous devez être averti de ne jamais effectuer de mise à jour ou d’exécution de tâches critiques du système, ou dans les cas où une correction absolue est requise à l’aide de données provenant d’une lecture NOLOCK
. Il est tout à fait possible que ces données contiennent des lignes qui ont été supprimées lors de l'exécution de la requête ou dans d'autres sessions non encore finalisées. Il est possible que ces données incluent des lignes qui ont été partiellement mises à jour. Il est possible que ces données contiennent des enregistrements qui violent les contraintes de clé étrangère. Il est possible que ces données excluent les lignes ajoutées à la table mais non encore validées.
Vous n'avez vraiment aucun moyen de savoir quel est l'état des données.
Si vous essayez d'obtenir un nombre de lignes ou d'autres données récapitulatives où une marge d'erreur est acceptable, alors NOLOCK
est un bon moyen d'améliorer les performances de ces requêtes et d'éviter qu'elles n'aient un impact négatif sur les performances de la base de données.
tilisez toujours le conseil NOLOCK
avec beaucoup de prudence et traitez toutes les données renvoyées de manière suspecte.
NOLOCK accélère la plupart des instructions SELECT en raison de l'absence de verrous partagés. En outre, l'absence de verrouillage des verrous signifie que votre SELECT ne gênera pas les rédacteurs.
NOLOCK est fonctionnellement équivalent à un niveau d'isolement de READ UNCOMMITTED. La principale différence est que vous pouvez utiliser NOLOCK sur certaines tables mais pas sur d’autres, si vous le souhaitez. Si vous envisagez d'utiliser NOLOCK sur toutes les tables d'une requête complexe, il est plus facile d'utiliser SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED, car il n'est pas nécessaire d'appliquer l'indicateur à chaque table.
Voici des informations sur tous les niveaux d’isolement à votre disposition, ainsi que des conseils de table.
En plus de ce qui est dit ci-dessus, vous devez être très conscient du fait que nolock impose en fait le risque que vous n'obtenez pas le fait d'obtenir des lignes qui ont été validées avant votre sélection.
Ce sera plus rapide car il ne faut pas attendre les verrous
Le SELECT en cours commencera plus tôt, car il n'a pas besoin d'attendre.
Les autres transactions vont ralentir car elles partagent maintenant leur temps de traitement avec une nouvelle transaction.
Ne l'utilisez pas.
NOLOCK est souvent exploité comme un moyen magique d’accélérer les lectures de bases de données, mais j’essaie d’éviter de l’utiliser autant que possible.
L'ensemble de résultats peut contenir des lignes qui n'ont pas encore été validées et qui sont souvent annulées ultérieurement.
Une erreur ou un ensemble de résultats peut être vide, être des lignes manquantes ou afficher la même ligne plusieurs fois.
En effet, d’autres transactions déplacent des données en même temps que vous les lisez.
READ COMMITTED ajoute un problème supplémentaire où les données sont corrompues dans une seule colonne lorsque plusieurs utilisateurs changent simultanément la même cellule.
Il y a également d'autres effets secondaires, qui ont pour conséquence de sacrifier l'augmentation de vitesse que vous espériez gagner en premier lieu.
Maintenant, vous savez, ne l'utilisez plus jamais.