Das Auftreten einer geordneten Ergebnismenge ohne ORDER BY
Klausel resultiert häufig aus einem Scan, bei dem Zeilen in Indexreihenfolge abgerufen werden. Ein Grund, warum ein Scan in Indexreihenfolge im Allgemeinen unter der Standardisolationsstufe ausgewählt READ COMMITTED
wird, besteht darin, dass die Wahrscheinlichkeit unerwünschter Parallelitätsanomalien verringert wird, z. B. das mehrfache Auftreten derselben Zeile oder das vollständige Überspringen einiger Zeilen. Dies wird an mehreren Stellen detailliert beschrieben, einschließlich in dieser Artikelserie über Isolationsstufen.
Mit einem NOLOCK
Tabellenhinweis wird dieses Verhalten gelockert, und der Zugriff auf die Tabelle erfolgt unter der toleranteren READ UNCOMMITTED
Isolationsstufe, die Daten in Zuordnungsreihenfolge anstelle der Indexreihenfolge scannen kann . Wie in diesem Link beschrieben, bleibt die Entscheidung, ob ein Scan der Zuordnungsreihenfolge oder der Indexreihenfolge verwendet werden soll, der Speicher-Engine überlassen. Diese Auswahl kann zwischen Ausführungen ohne Änderung des Abfrageplans geändert werden .
Dies mag sehr abstrakt klingen, kann jedoch mit einigen Abfragen mithilfe nicht dokumentierter Funktionen für die AdventureWorks2012-Datenbank einfacher demonstriert werden .
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);
Die Anfragen wurden mit geringfügigen Änderungen von Paul White ausgeliehen .
Um ganz klar zu sein, handelt es sich bei dieser Antwort um das Erscheinungsbild einer geordneten Ergebnismenge. Es gibt keine garantierte Präsentationsreihenfolge ohne Top-Level ORDER BY
.
Ein Scan der Zuordnungsreihenfolge kann unter verschiedenen anderen Umständen erfolgen, z. B. wenn eine Sperre auf Tabellenebene erworben wird oder sich die Datenbank im schreibgeschützten Modus befindet. Parallelität kann auch die Reihenfolge beeinflussen, in der die Daten zurückgegeben werden. Der entscheidende Punkt ist, dass ORDER BY
die Reihenfolge, in der die Daten zurückgegeben werden , ohne Design im Laufe der Zeit variieren kann.