Je suppose que la vraie question est:
Si je ne me soucie pas des lectures incorrectes , l'ajout de l' indicateur with (NOLOCK) à une instruction SELECT affectera les performances de:
- l'instruction SELECT en cours
- autres transactions par rapport au tableau donné
Exemple:
Select *
from aTable with (NOLOCK)
sql
sql-server
locking
Bob Probst
la source
la source
Réponses:
1) Oui , une sélection avec
NOLOCK
se terminera plus rapidement qu'une sélection normale.2) Oui , une sélection avec
NOLOCK
permettra à d'autres requêtes sur la table effectuée de se terminer plus rapidement qu'une sélection normale.Pourquoi serait-ce?
NOLOCK
généralement (en fonction de votre moteur de base de données) signifie me donner vos données, et je me fiche de l'état dans lequel elles se trouvent, et ne vous embêtez pas à les garder immobiles pendant que vous les lisez. C'est à la fois plus rapide, moins gourmand en ressources et très très dangereux.Vous devez être averti de ne jamais effectuer de mise à jour ou d'exécuter quoi que ce soit de critique sur le système, ou lorsqu'une exactitude absolue est requise en utilisant des données provenant d'une
NOLOCK
lecture. Il est absolument possible que ces données contiennent des lignes qui ont été supprimées lors de l'exécution de la requête ou qui ont été supprimées dans d'autres sessions qui n'ont pas encore été 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 qui ont été ajoutées à la table mais qui n'ont pas encore été validées.Vous n'avez vraiment aucun moyen de savoir quel est l'état des données.
Si vous essayez d'obtenir des choses comme un nombre de lignes ou d'autres données récapitulatives où une certaine marge d'erreur est acceptable,
NOLOCK
c'est un bon moyen d'augmenter les performances de ces requêtes et d'éviter qu'elles aient un impact négatif sur les performances de la base de données.Utilisez toujours cet
NOLOCK
indice avec une grande prudence et traitez toutes les données qu'il renvoie de manière suspecte.la source
NOLOCK accélère la plupart des instructions SELECT, en raison du manque de verrous partagés. De plus, l'absence de délivrance des verrous signifie que les écrivains ne seront pas gênés par votre SELECT.
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 prévoyez 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 vous n'avez pas à appliquer l'indicateur à chaque table.
Voici des informations sur tous les niveaux d'isolement à votre disposition, ainsi que des conseils de tableau.
DÉFINIR LE NIVEAU D'ISOLEMENT DE TRANSACTION
Conseil de table (Transact-SQL)
la source
En plus de ce qui est dit ci-dessus, vous devez être très conscient que nolock vous impose en fait le risque de ne pas obtenir de lignes qui ont été validées avant votre sélection.
Voir http://blogs.msdn.com/sqlcat/archive/2007/02/01/previous-committed-rows-might-be-missed-if-nolock-hint-is-used.aspx
la source
Ce sera plus rapide car il n'a pas à attendre les verrous
la source
La réponse est Oui si la requête est exécutée plusieurs fois à la fois, car chaque transaction n'aura pas besoin d'attendre la fin des autres. Cependant, si la requête est exécutée une seule fois, la réponse est Non.
Oui . Il y a une forte probabilité qu'une utilisation prudente de WITH (NOLOCK) accélère globalement votre base de données. Cela signifie que d'autres transactions n'auront pas à attendre la fin de cette instruction SELECT, mais d'un autre côté, d'autres transactions ralentiront car elles partagent maintenant leur temps de traitement avec une nouvelle transaction.
Veillez à utiliser uniquement
WITH (NOLOCK)
dans les instructions SELECT sur les tables qui ont un index cluster.WITH (NOLOCK) est souvent exploité comme un moyen magique pour accélérer les transactions de lecture de base de données.
Le jeu de résultats peut contenir des lignes qui n'ont pas encore été validées, qui sont souvent annulées ultérieurement.
Si WITH (NOLOCK) est appliqué à une table qui a un index non clusterisé, les index de ligne peuvent être modifiés par d'autres transactions pendant que les données de ligne sont diffusées dans la table de résultats. Cela signifie que le jeu de résultats peut manquer de lignes ou afficher plusieurs fois la même ligne.
READ COMMITTED ajoute un problème supplémentaire où les données sont corrompues dans une seule colonne où plusieurs utilisateurs changent la même cellule simultanément.
la source