Tôi đang chiến đấu chống lại NOLOCK trong môi trường hiện tại của tôi. Một lập luận tôi đã nghe là chi phí khóa làm chậm một truy vấn. Vì vậy, tôi đã nghĩ ra một thử nghiệm để xem mức phí này có thể là bao nhiêu.
Tôi phát hiện ra rằng NOLOCK thực sự làm chậm quá trình quét của tôi.
Lúc đầu, tôi rất vui mừng, nhưng bây giờ tôi chỉ bối rối. Là bài kiểm tra của tôi không hợp lệ bằng cách nào đó? NOLOCK có thực sự không cho phép quét nhanh hơn một chút không? Chuyện gì đang xảy ra ở đây vậy?
Đây là kịch bản của tôi:
USE TestDB
GO
--Create a five-million row table
DROP TABLE IF EXISTS dbo.JustAnotherTable
GO
CREATE TABLE dbo.JustAnotherTable (
ID INT IDENTITY PRIMARY KEY,
notID CHAR(5) NOT NULL )
INSERT dbo.JustAnotherTable
SELECT TOP 5000000 'datas'
FROM sys.all_objects a1
CROSS JOIN sys.all_objects a2
CROSS JOIN sys.all_objects a3
/********************************************/
-----Testing. Run each multiple times--------
/********************************************/
--How fast is a plain select? (I get about 587ms)
DECLARE @trash CHAR(5), @dt DATETIME = SYSDATETIME()
SELECT @trash = notID --trash variable prevents any slowdown from returning data to SSMS
FROM dbo.JustAnotherTable
ORDER BY ID
OPTION (MAXDOP 1)
SELECT DATEDIFF(MILLISECOND,@dt,SYSDATETIME())
----------------------------------------------
--Now how fast is it with NOLOCK? About 640ms for me
DECLARE @trash CHAR(5), @dt DATETIME = SYSDATETIME()
SELECT @trash = notID
FROM dbo.JustAnotherTable (NOLOCK)
ORDER BY ID --would be an allocation order scan without this, breaking the comparison
OPTION (MAXDOP 1)
SELECT DATEDIFF(MILLISECOND,@dt,SYSDATETIME())
Những gì tôi đã thử mà không hoạt động:
- Chạy trên các máy chủ khác nhau (cùng kết quả, máy chủ là 2016-SP1 và 2016-SP2, cả hai đều yên tĩnh)
- Chạy trên dbfiddle.uk trên các phiên bản khác nhau (ồn ào, nhưng có thể có cùng kết quả)
- THIẾT LẬP CẤP ĐỘ thay vì gợi ý (cùng kết quả)
- Tắt leo thang khóa trên bàn (kết quả tương tự)
- Kiểm tra thời gian thực hiện quét thực tế trong kế hoạch truy vấn thực tế (cùng kết quả)
- Biên dịch lại gợi ý (cùng kết quả)
- Chỉ đọc filegroup (cùng kết quả)
Khám phá hứa hẹn nhất đến từ việc loại bỏ biến rác và sử dụng truy vấn không có kết quả. Ban đầu điều này cho thấy NOLOCK nhanh hơn một chút, nhưng khi tôi đưa bản demo cho sếp của mình, NOLOCK đã trở lại chậm hơn.
NOLOCK làm chậm quá trình quét với phép gán biến là gì?