Tôi đã gặp vấn đề này gần đây và không thể tìm thấy bất kỳ cuộc thảo luận nào về nó trực tuyến.
Các truy vấn dưới đây
DECLARE @S VARCHAR(1) = '';
WITH T
AS (SELECT name + @S AS name2,
*
FROM master..spt_values)
SELECT *
FROM T T1
INNER JOIN T T2
ON T1.name2 = T2.name2;
Luôn luôn có một kế hoạch vòng lặp lồng nhau
Cố gắng buộc vấn đề với INNER HASH JOIN
hoặc INNER MERGE JOIN
gợi ý tạo ra lỗi sau.
Bộ xử lý truy vấn không thể tạo ra một kế hoạch truy vấn vì các gợi ý được xác định trong truy vấn này. Gửi lại truy vấn mà không chỉ định bất kỳ gợi ý nào và không sử dụng SET FORCEPLAN.
Tôi đã tìm thấy một cách giải quyết cho phép băm hoặc hợp nhất các phép nối được sử dụng - gói biến trong một tổng hợp. Gói được tạo ra có chi phí thấp hơn đáng kể (19,2025 so với 0,261987)
DECLARE @S2 VARCHAR(1) = '';
WITH T
AS (SELECT name + (SELECT MAX(@S2)) AS name2,
*
FROM spt_values)
SELECT *
FROM T T1
INNER JOIN T T2
ON T1.name2 = T2.name2;
Lý do cho hành vi này là gì? và có một cách giải quyết tốt hơn so với cái mà tôi tìm thấy? (có lẽ không yêu cầu các nhánh kế hoạch thực hiện thêm)