Sự xuất hiện của một tập kết quả được đặt hàng, không có ORDER BY
mệnh đề, thường là kết quả của quá trình quét lấy các hàng theo thứ tự chỉ mục. Một lý do tại sao quét theo thứ tự thường được chọn theo READ COMMITTED
mức cô lập mặc định là vì nó làm giảm khả năng xảy ra sự bất thường đồng thời không mong muốn như gặp phải cùng một hàng nhiều lần hoặc bỏ qua một số hàng. Đây là chi tiết ở một số nơi, bao gồm trong loạt bài viết về mức độ cô lập.
Với một NOLOCK
gợi ý bảng, hành vi này được nới lỏng và việc truy cập vào bảng được thực hiện dưới READ UNCOMMITTED
mức cô lập khoan dung hơn , có thể quét dữ liệu theo thứ tự phân bổ thay vì thứ tự chỉ mục. Như được mô tả trong liên kết đó, quyết định về việc sử dụng quét theo thứ tự cấp phát hoặc thứ tự chỉ mục được dành cho công cụ lưu trữ. Lựa chọn này có thể thay đổi giữa các lần thực hiện mà không thay đổi trong kế hoạch truy vấn .
Điều này nghe có vẻ rất trừu tượng, nhưng có thể được chứng minh dễ dàng hơn với một số truy vấn sử dụng các chức năng không có giấy tờ đối với cơ sở dữ liệu 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);
Các truy vấn được mượn với sửa đổi nhỏ từ Paul White .
Cuối cùng, để rõ ràng, câu trả lời này là về sự xuất hiện của một tập kết quả được đặt hàng. Không có thứ tự trình bày được đảm bảo mà không có cấp cao nhất ORDER BY
.
Quét theo thứ tự phân bổ có thể xảy ra trong nhiều trường hợp khác, chẳng hạn như khi có được khóa cấp bảng hoặc cơ sở dữ liệu ở chế độ chỉ đọc. Tính song song cũng có thể ảnh hưởng đến thứ tự dữ liệu được trả về. Điểm quan trọng là không có ORDER BY
, dữ liệu thứ tự được trả về có thể thay đổi theo thời gian theo thiết kế.