Pojawienie się uporządkowanego zestawu wyników bez ORDER BY
klauzuli często wynika ze skanu pobierającego wiersze w kolejności indeksu. Jednym z powodów, dla których skanowanie kolejności indeksów jest zwykle wybierane poniżej domyślnego READ COMMITTED
poziomu izolacji, jest to, że zmniejsza ryzyko niepożądanych anomalii współbieżności, takich jak wielokrotne napotkanie tego samego wiersza lub całkowite pominięcie niektórych wierszy. Jest to szczegółowo opisane w kilku miejscach, w tym w tej serii artykułów o poziomach izolacji.
Dzięki NOLOCK
podpowiedzi do tabeli zachowanie to jest złagodzone, a dostęp do tabeli odbywa się na bardziej tolerancyjnym READ UNCOMMITTED
poziomie izolacji, który może skanować dane w kolejności alokacji zamiast w kolejności indeksu. Jak opisano w tym łączu, decyzja o tym, czy użyć skanowania kolejności alokacji, czy skanowania kolejności indeksu, należy do silnika pamięci masowej. Ten wybór może zmieniać się między wykonaniami bez zmiany planu zapytań .
Może to zabrzmieć bardzo abstrakcyjnie, ale można to łatwiej zademonstrować za pomocą niektórych zapytań wykorzystujących nieudokumentowane funkcje w bazie danych 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);
Zapytania zostały zapożyczone z niewielką modyfikacją od Paula White'a .
Wreszcie, dla jasności, ta odpowiedź dotyczy wyglądu uporządkowanego zestawu wyników. Nie ma gwarantowanej kolejności prezentacji bez najwyższego poziomu ORDER BY
.
Skanowanie kolejności alokacji może wystąpić w różnych innych okolicznościach, na przykład w momencie uzyskania blokady na poziomie tabeli lub gdy baza danych jest w trybie tylko do odczytu. Równoległość może również wpływać na kolejność zwracania danych. Kluczową kwestią jest to, że bez ORDER BY
tego zwracane dane mogą się zmieniać w czasie w zależności od projektu.