ฉันเจอปัญหานี้เมื่อเร็ว ๆ นี้และไม่พบการสนทนาออนไลน์
แบบสอบถามด้านล่าง
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;
รับแผนลูปซ้อนกันเสมอ
การพยายามบังคับให้เกิดปัญหากับINNER HASH JOIN
หรือINNER MERGE JOIN
คำแนะนำจะทำให้เกิดข้อผิดพลาดดังต่อไปนี้
ตัวประมวลผลแบบสอบถามไม่สามารถสร้างแผนแบบสอบถามได้เนื่องจากคำแนะนำที่กำหนดไว้ในแบบสอบถามนี้ ส่งแบบสอบถามโดยไม่ระบุคำแนะนำใด ๆ และไม่ต้องใช้ SET FORCEPLAN
ฉันพบวิธีแก้ปัญหาที่อนุญาตให้ใช้การรวมแฮชหรือการผสาน - การรวมตัวแปรในการรวม แผนที่สร้างขึ้นนั้นมีต้นทุนที่ต่ำกว่าอย่างมาก (19.2025 เทียบกับ 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;
อะไรคือสาเหตุของพฤติกรรมนี้? และมีวิธีแก้ปัญหาที่ดีกว่าที่ฉันพบ? (ซึ่งอาจไม่จำเป็นต้องมีสาขาแผนการดำเนินการพิเศษ)