Mã ví dụ trong mục kết nối này
Hiển thị một lỗi trong đó
SELECT COUNT(*)
FROM dbo.my_splitter_1('2') L1
INNER JOIN dbo.my_splitter_1('') L2
ON L1.csv_item = L2.csv_item
Trả về kết quả chính xác. Nhưng những điều sau đây trả về kết quả không chính xác (vào năm 2014 bằng cách sử dụng Công cụ ước tính Cardinality mới)
SELECT
(SELECT COUNT(*)
FROM dbo.my_splitter_1('2') L1
INNER JOIN dbo.my_splitter_1('') L2
ON L1.csv_item = L2.csv_item)
Vì nó tải không chính xác các kết quả cho L2 vào một bộ đệm biểu thức con chung sau đó phát lại kết quả của kết quả đó cho kết quả L1.
Tôi tò mò về lý do tại sao sự khác biệt trong hành vi giữa hai truy vấn. Trace Flag 8675 cho thấy cái nào hoạt động được search(0) - transaction processing
và cái bị hỏng search(1) - quick plan
.
Vì vậy, tôi cho rằng sự sẵn có của các quy tắc chuyển đổi bổ sung đằng sau sự khác biệt trong hành vi (vô hiệu hóa BuildGbApply hoặc GenGbApplySimple dường như để khắc phục nó chẳng hạn).
Nhưng tại sao hai kế hoạch cho các truy vấn rất giống nhau này gặp phải các giai đoạn tối ưu hóa khác nhau? Từ những gì tôi đã đọc search (0)
yêu cầu ít nhất ba bảng và điều kiện đó chắc chắn không được đáp ứng trong ví dụ đầu tiên.