Поява впорядкованого набору результатів, без ORDER BY
застереження, часто є результатом сканування, вилучення рядків у порядку індексу. Однією з причин, чому сканування порядку індексів зазвичай вибирається за READ COMMITTED
рівнем ізоляції за замовчуванням, є те, що це зменшує шанси небажаних аномалій паралельної валюти, таких як зустрічатися з одним і тим же рядком кілька разів або повністю пропускати деякі рядки. Це детально описано в кількох місцях, у тому числі в цій серії статей про рівні ізоляції.
З NOLOCK
натяком на таблицю така поведінка є розслабленою, і доступ до таблиці здійснюється в умовах більш толерантного READ UNCOMMITTED
рівня ізоляції, який може сканувати дані в порядку розподілу замість порядку індексу. Як описано в цьому посиланні, рішення про те, чи використовувати сканування порядку розподілу чи індексу, покладається на механізм зберігання даних. Цей вибір може змінюватися між виконанням без зміни плану запитів .
Це може здатися дуже абстрактним, але його можна легше продемонструвати за допомогою деяких запитів, використовуючи незадокументовані функції щодо бази даних 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);
Запити запозичені з невеликою модифікацією у Пола Уайта .
Нарешті, щоб зрозуміти, ця відповідь стосується появи впорядкованого набору результатів. Немає гарантованого замовлення на презентацію без вищого рівня ORDER BY
.
Сканування порядку розподілу може відбуватися за різних інших обставин, наприклад, коли придбано блокування рівня таблиці або база даних перебуває в режимі лише для читання. Паралелізм також може впливати на порядок повернення даних. Ключовим моментом є те, що без ORDER BY
цього повернення даних замовлення може змінюватися в залежності від часу.