ฉันมีแบบสอบถามที่รวมตารางไม่กี่ตารางและทำงานได้ไม่ดีนัก - การประมาณแถวเป็นวิธีปิด (1,000 ครั้ง) และมีการเลือกการเข้าร่วมลูปซ้อนกันทำให้เกิดการสแกนหลายตาราง รูปร่างของแบบสอบถามค่อนข้างตรงไปตรงมามีลักษณะดังนี้:
SELECT t1.id
FROM t1
INNER JOIN t2 ON t1.id = t2.t1_id
LEFT OUTER JOIN t3 ON t2.id = t3.t2_id
LEFT OUTER JOIN t4 ON t3.t4_id = t4.id
WHERE t4.id = some_GUID
เล่นรอบกับแบบสอบถามฉันสังเกตเห็นว่าเมื่อฉันบอกเป็นนัย ๆ ให้ใช้การรวม Merge สำหรับการรวมอย่างใดอย่างหนึ่งมันทำงานเร็วขึ้นหลายครั้ง สิ่งนี้ฉันสามารถเข้าใจได้ - การรวมการผสานเป็นตัวเลือกที่ดีกว่าสำหรับข้อมูลที่เข้าร่วม แต่ SQL Server ไม่คาดการณ์ว่าจะเลือก Nested Loops ได้ถูกต้อง
สิ่งที่ฉันไม่เข้าใจอย่างเต็มที่เป็นเพราะเหตุใดคำแนะนำการเข้าร่วมนี้จึงเปลี่ยนประมาณการทั้งหมดสำหรับผู้ดำเนินการแผนทั้งหมด จากการอ่านบทความและหนังสือที่แตกต่างกันฉันสันนิษฐานว่าการประเมิน cardinality ดำเนินการก่อนสร้างแผนดังนั้นการใช้คำใบ้จะไม่เปลี่ยนแปลงการประมาณ แต่บอกให้ SQL Server ใช้การเข้าร่วมแบบฟิสิคัลโดยเฉพาะ
อย่างไรก็ตามสิ่งที่ฉันเห็นคือการรวมคำใบ้ทำให้การประมาณการทั้งหมดสมบูรณ์แบบมาก ทำไมสิ่งนี้ถึงเกิดขึ้นและมีเทคนิคใด ๆ ที่ทำให้การเพิ่มประสิทธิภาพข้อความค้นหาทำการประมาณที่ดีขึ้นโดยไม่ต้องบอกใบ้ - เมื่อพิจารณาว่าสถิติอนุญาตอย่างชัดเจน
UPD: แผนการดำเนินการที่ไม่ระบุชื่อสามารถพบได้ที่นี่: https://www.dropbox.com/s/hchfuru35qqj89s/merge_join.sqlplan?dl=0 https://www.dropbox.com/s/38sjtv0t7vjjfdp/no_hoins_join.slplan?dl = 0
ฉันตรวจสอบสถิติที่ใช้โดยข้อความค้นหาทั้งสองโดยใช้ TF 3604, 9292 และ 9204 และสิ่งเหล่านั้นเหมือนกัน อย่างไรก็ตามดัชนีที่สแกน / ค้นหาแตกต่างกันระหว่างเคียวรี
นอกจากนั้นฉันพยายามเรียกใช้แบบสอบถามด้วยOPTION (FORCE ORDER)
- มันทำงานเร็วกว่าการใช้การรวมแบบผสานเลือก HASH MATCH สำหรับการเข้าร่วมทุกครั้ง