Combien de lignes sont sélectionnées sur une table en expansion lorsque je sélectionne tout avec WITH (NOLOCK)?

Imaginez que j'ai une table foo dans ma database et que chaque millisecondes INSERTING nouvelle ligne à cette table.

Lorsque vous exécutez la requête ci-dessous:

 SELECT * From foo WITH(NOLOCK) 

Et comme la table est en expansion continue, comment le SQL server décide-t-il d'get le nombre de lignes de cette table dans les résultats de la search lorsque je lance la requête sans verrou?

Est un comportement non spécifié. NOLOCK peut renvoyer toutes les lignes, ne peut renvoyer aucune ligne (oui, il le peut!), Il peut manquer des lignes et renvoyer des lignes dupliquées. Littéralement, tous les cas sont possibles. En pratique, si la table subit des changements (INSERTS), il est très probable que vous obtiendrez des lignes manquantes et des lignes dupliquées avec une probabilité très élevée. L'explication a à voir avec la façon dont une requête nolock parsing datatables (dans l'ordre de répartition ) et comment la modification des données déplace datatables (la page se divise sur les b-trees, la ligne avance sur les tas). Ces mouvements de données peuvent déplacer datatables en avant ou en arrière du sharepoint numérisation actuel et entraîner des données manquantes (manquant, déplacé derrière le point d'parsing en cours avant d'être lu) ou dupliquées (en avance sur le point d'parsing actuel après il a été lu une fois, ou deux fois même).

Voir Les lignes précédemment validées peuvent être ignorées si l'indicateur NOLOCK est utilisé pour une discussion plus détaillée.