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);
Paul White 로부터 약간의 수정으로 쿼리가 차용되었습니다 .
마지막으로,이 답변은 정렬 된 결과 집합 의 모양 에 관한 것입니다. 최상위 수준 이 없으면 프레젠테이션 순서 가 보장되지 않습니다ORDER BY
.
할당 순서 스캔은 테이블 레벨 잠금이 확보되거나 데이터베이스가 읽기 전용 모드 인 경우와 같은 다양한 기타 상황에서 발생할 수 있습니다. 병렬 처리는 데이터가 반환되는 순서에 영향을 줄 수도 있습니다. 요점은을 포함하지 않으면 ORDER BY
순서 데이터가 반환되는 순서는 설계에 따라 시간이 지남에 따라 달라질 수 있다는 것입니다.