ฉันกำลังถามคำถามนี้เพื่อให้เข้าใจถึงพฤติกรรมของเครื่องมือเพิ่มประสิทธิภาพและเข้าใจขีด จำกัด รอบ ๆ ดัชนีสิ่งของ สมมติว่าฉันใส่จำนวนเต็มจาก 1 ถึง 10,000 ลงในกอง:
CREATE TABLE X_10000 (ID INT NOT NULL);
truncate table X_10000;
INSERT INTO X_10000 WITH (TABLOCK)
SELECT TOP 10000 ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
และบังคับให้วงวนซ้อนกันเข้าร่วมกับMAXDOP 1
:
SELECT *
FROM X_10000 a
INNER JOIN X_10000 b ON a.ID = b.ID
OPTION (LOOP JOIN, MAXDOP 1);
นี่เป็นการกระทำที่ไม่เป็นมิตรที่จะใช้กับ SQL Server การรวมลูปซ้อนกันมักจะไม่เป็นตัวเลือกที่ดีเมื่อทั้งสองตารางไม่มีดัชนีที่เกี่ยวข้อง นี่คือแผน:
การสืบค้นใช้เวลา 13 วินาทีบนเครื่องของฉันที่ดึงข้อมูล 100,00000 แถวจากสปูลตาราง อย่างไรก็ตามฉันไม่เห็นว่าทำไมการสืบค้นจึงต้องช้า เครื่องมือเพิ่มประสิทธิภาพคิวรีมีความสามารถในการสร้างดัชนีได้ทันทีผ่านดัชนีสปูล แบบสอบถามนี้ดูเหมือนว่าจะเป็นตัวเลือกที่สมบูรณ์แบบสำหรับสปูลดัชนี
แบบสอบถามต่อไปนี้จะส่งคืนผลลัพธ์เดียวกับแบบสอบถามแรกมีดัชนีสปูลและเสร็จสิ้นในเวลาน้อยกว่าหนึ่งวินาที:
SELECT *
FROM X_10000 a
CROSS APPLY (SELECT TOP (9223372036854775807) b.ID FROM X_10000 b WHERE a.ID = b.ID) ca
OPTION (LOOP JOIN, MAXDOP 1);
แบบสอบถามนี้ยังมีสปูลดัชนีและเสร็จสิ้นในเวลาน้อยกว่าหนึ่งวินาที:
SELECT *
FROM X_10000 a
INNER JOIN X_10000 b ON a.ID >= b.ID AND a.ID <= b.ID
OPTION (LOOP JOIN, MAXDOP 1);
เหตุใดแบบสอบถามต้นฉบับจึงไม่มีดัชนีสปูล มีชุดของคำแนะนำที่เป็นเอกสารหรือไม่มีเอกสารหรือแฟล็กการติดตามที่จะให้ดัชนีสปูลหรือไม่? ฉันพบคำถามที่เกี่ยวข้องแต่ไม่ได้ตอบคำถามของฉันอย่างสมบูรณ์และฉันไม่สามารถรับค่าสถานะการสืบค้นลึกลับเพื่อใช้งานกับแบบสอบถามนี้