Bộ điều hợp chế độ hàng loạt (đặt trong kế hoạch truy vấn trong đó xử lý hàng chuyển sang xử lý theo lô hoặc theo cách khác) hiển thị như ???
trong DMV với thread_id
0. Tuy nhiên, truy vấn mẫu không sử dụng xử lý hàng loạt nên không phải là xử lý theo lô nguyên nhân ở đây.
Các vòng lặp lồng nhau cũng có thể chịu trách nhiệm cho các hàng thừa hiển thị trong sys.dm_exec_query_profiles
. Có một cờ theo dõi tài liệu để vô hiệu hóa tìm nạp trước vòng lặp lồng nhau:
Cờ theo dõi 8744 vô hiệu hóa tìm nạp trước cho toán tử Nested Loops.
Việc sử dụng cờ theo dõi này không chính xác có thể gây ra các lần đọc vật lý bổ sung khi SQL Server thực thi các gói có chứa toán tử Vòng lặp lồng nhau. Để biết thêm thông tin về toán tử Vòng lặp lồng nhau, hãy xem chủ đề "Tham chiếu toán tử vật lý và logic" trong Sách trực tuyến của SQL Server 2005.
Nếu tôi thêm một gợi ý truy vấn QUERYTRACEON 8744
vào truy vấn thì các ???
nút không còn xuất hiện nữa.
Để có một ví dụ có thể lặp lại về tìm nạp trước vòng lặp lồng nhau, tôi sẽ mượn ví dụ của Paul White chống lại Adventure Works từ bài viết Tìm nạp trước vòng lặp lồng nhau của anh ấy :
SELECT TOP (1000)
P.Name,
TH.TransactionID
FROM Production.Product AS P
JOIN Production.TransactionHistory AS TH
ON TH.ProductID = P.ProductID
WHERE
P.Name LIKE N'[K-P]%'
ORDER BY
P.Name,
TH.TransactionID;
Nếu tôi chạy truy vấn đó với SQL Server 2016 SP1 và nhanh chóng nắm bắt đầu ra của sys.dm_exec_query_profiles
tôi, tôi sẽ nhận được các kết quả sau:
╔════════════════════╦════════════════════════╦═════════╦═══════════╗
║ OBJECT_NAME ║ physical_operator_name ║ node_id ║ thread_id ║
╠════════════════════╬════════════════════════╬═════════╬═══════════╣
║ NULL ║ Top ║ 0 ║ 0 ║
║ NULL ║ Nested Loops ║ 1 ║ 0 ║
║ TransactionHistory ║ ??? ║ 2 ║ 0 ║
║ Product ║ Index Seek ║ 3 ║ 0 ║
║ TransactionHistory ║ Index Seek ║ 4 ║ 0 ║
╚════════════════════╩════════════════════════╩═════════╩═══════════╝
Nếu tôi chạy cùng một truy vấn trong SQL Server 2014, tôi nhận được các kết quả sau:
╔════════════════════╦════════════════════════╦═════════╦═══════════╗
║ OBJECT_NAME ║ physical_operator_name ║ node_id ║ thread_id ║
╠════════════════════╬════════════════════════╬═════════╬═══════════╣
║ NULL ║ Top ║ 0 ║ 0 ║
║ NULL ║ Nested Loops ║ 1 ║ 0 ║
║ Product ║ Index Seek ║ 3 ║ 0 ║
║ TransactionHistory ║ Index Seek ║ 4 ║ 0 ║
╚════════════════════╩════════════════════════╩═════════╩═══════════╝
Trong cả hai trường hợp, tối ưu hóa tìm nạp vòng lặp lồng nhau xảy ra. Dường như chỉ có SQL Server 2016 báo cáo mặc dù điều đó có thể giải thích tại sao tôi chưa bao giờ thấy điều này trong SQL Server 2014.