Появление упорядоченного результирующего набора без 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
, что без этого данные, в которых возвращаются данные, могут изменяться с течением времени в зависимости от конструкции.