Tại sao một số hàng được trả về bởi sys.dm_exec_query_profiles có? cho tên toán tử vật lý?


7

SQL Server 2014 đã giới thiệu sys.dm_exec_query_profiles DMV cung cấp cách theo dõi tiến trình thực hiện các truy vấn theo thời gian thực. Gần đây tôi đã xem xét một truy vấn hơi phức tạp trong SQL Server 2016 SP1 và nhận thấy có sys.dm_exec_query_profileschứa các nút bổ sung không có trong kế hoạch truy vấn. Các nút này có ???cho physical_operator_name:

???

Đối với phiên bản song song của truy vấn, chỉ có một nút ẩn. Nút có object_idliên kết với bảng bên trong của phép nối vòng lặp lồng nhau. Theo node_idđây là nơi mà nút nên xuất hiện:

song song, tương đông ???

Chạy truy vấn với MAXDOP 1kết quả là một vài nút ẩn. Các ???nút xuất hiện ở cùng một nơi như trước:

nối tiếp 1 ???

Ngoài ra còn có một cái mới không có trong kế hoạch song song:

nối tiếp 2 ???

Chúng chỉ xuất hiện xung quanh một số tham gia vòng lặp lồng nhau. Tôi không thể nhớ lại đã thấy hành vi này trên SQL Server 2014. Thật không may, truy vấn rất phức tạp và tôi không thể tải lên một kế hoạch ẩn danh.

Những gì đang xảy ra ở đây? Tại sao sys.dm_exec_query_profilesbáo cáo các nút kế hoạch truy vấn bổ sung không hiển thị trong kế hoạch đồ họa?

Câu trả lời:


7

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_id0. 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 8744và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_profilestô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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.