L'apparition d'un jeu de résultats ordonné, sans ORDER BY
clause, résulte souvent d'une analyse récupérant les lignes dans l'ordre des index. L'une des raisons pour lesquelles une analyse d'ordre d'index est généralement choisie sous le READ COMMITTED
niveau d'isolement par défaut est qu'elle réduit les risques d'anomalies simultanées indésirables, telles que la rencontre de la même ligne plusieurs fois ou l'omission complète de certaines lignes. Ceci est détaillé à plusieurs endroits, y compris dans cette série d'articles sur les niveaux d'isolement.
Avec une NOLOCK
indication de table, ce comportement est détendu et l'accès à la table est effectué sous le READ UNCOMMITTED
niveau d'isolement plus tolérant , qui peut analyser les données dans l'ordre d'allocation au lieu de l'ordre d'index. Comme décrit dans ce lien, la décision d'utiliser ou non une analyse d'ordre d'allocation ou d'index est laissée au moteur de stockage. Ce choix peut changer entre les exécutions sans modification du plan de requête .
Cela peut sembler très abstrait, mais peut être plus facilement démontré avec certaines requêtes utilisant des fonctions non documentées sur la base de données AdventureWorks2012 .
USE AdventureWorks2012;
GO
-- Appears to be ordered by BusinessEntityID
-- File:Page:Slot goes up and down several times
-- Show physical locations with sys.fn_PhysLocFormatter (undocumented)
SELECT
P.BusinessEntityID,
[(File:Page:Slot)] =
sys.fn_PhysLocFormatter(%%physloc%%)
FROM Person.Person AS P;
-- Same query with TABLOCK or NOLOCK
-- Allocation-order (IAM) scan
-- Now appears to be ordered by File:Page:Slot instead of BusinessEntityID
SELECT P.BusinessEntityID,
[(File:Page:Slot)] =
sys.fn_PhysLocFormatter(%%physloc%%)
FROM Person.Person AS P WITH (NOLOCK);
Les requêtes sont empruntées avec une légère modification à Paul White .
Enfin, juste pour être clair, cette réponse concerne l' apparence d'un ensemble de résultats ordonné. Il n'y a pas d'ordre de présentation garanti sans un niveau supérieur ORDER BY
.
Une analyse de l'ordre d'allocation peut se produire dans diverses autres circonstances, par exemple lorsqu'un verrou de niveau table est acquis ou que la base de données est en mode lecture seule. Le parallélisme peut également influencer l'ordre dans lequel les données sont renvoyées. Le point clé est que sans ORDER BY
, les données de l'ordre retournées peuvent varier dans le temps par conception.