เออร์วิน: ฉันจะเห็นพ้องกับแนวคิดที่ว่าการใช้การสั่งซื้อแบบแข็งสามารถสร้างกรณีขอบจำนวนมากได้ซึ่งแผนการที่เหมาะสมจะถูกตัดออกไป ฉันเพิ่งช่วยคนที่มีอะไรเช่นนี้ในแบบสอบถามของเขา:
LEFT JOIN (
a
JOIN b ON a.id = b.a_id
JOIN c ON b.c_id = c.id
) ON a.id = something.a_id
LEFT JOIN (
table1 t1
JOIN table2 t2 ON t1.some_field = t2.other_field
JOIN talbe3 t3 ON t2.yafield = t3.something_else
) ON ....
repeat a few more times
ในกรณีของเขาสิ่งที่เลวร้ายที่สุดของบล็อกการรวมเหล่านี้ทำให้เกิดการวนซ้ำซ้อนกันของแถว 200k แถวประมาณ 20k ครั้ง (คำนวณทางคณิตศาสตร์) และเนื่องจากคีย์ไม่สามารถถูกผลักไปยังดัชนีได้มันเป็นการสแกนตามลำดับ ซึ่งหมายความว่าแบบสอบถามโดยรวมใช้เวลาประมาณ 3 ชั่วโมงในการทำงานเนื่องจากการเปลี่ยนแปลงแผนแบบเรียงซ้อน ด้วยการกระจายการเข้าร่วมด้านซ้ายคีย์อาจถูกกดลงและการค้นหาทำงานในเวลาไม่กี่วินาที แน่นอนว่านี่ไม่ใช่สิ่งที่เท่าเทียมกันซึ่งเป็นสาเหตุที่นักวางแผนไม่สามารถปฏิบัติต่อพวกเขาได้อย่างเท่าเทียมกันดังนั้นจึงมีการคิดออกว่าแผนการนั้นคือการเข้าร่วมแฮชแล้วทำการวนซ้ำซ้อนกันซึ่งช้าลงอย่างเจ็บปวด
เมื่อใดก็ตามที่คุณบังคับให้การเข้าร่วมผ่านลำดับที่แน่นอนคุณแนะนำกรณีที่อาจไม่มีข้อมูลตัวกรองหลักในการดำเนินการตามแผนดังนั้นสิ่งที่อาจเป็นไปได้ที่จะทำในภายหลังในการสแกนดัชนีแบบด่วน / การเข้าร่วมแฮช อาจจะต้องทำช้าลงมากในการสแกนวนซ้ำ / ลำดับต่อเนื่องและดังนั้นในขณะที่ส่วนข้างต้นไม่เทียบเท่าทันทีมันแสดงปัญหาเดียวกัน
USING
มันเร็วกว่าเล็กน้อย- เพราะมันทำให้คอลัมน์น้อยลงในเมทริกซ์ผลลัพธ์ การค้นพบของคุณย้อนกลับไปในปี 2005 และ 2008 ฉันคิดว่าปัญหาใด ๆ ได้รับการแก้ไขแล้วในขณะนี้ อย่างไรก็ตามฉันสามารถเห็นข้อ จำกัด ที่เป็นไปได้: JOIN ที่มีUSING
อาจจะต้องมีการใช้งานตามลำดับเนื่องจากคอลัมน์การเข้าร่วมที่เป็นผลลัพธ์เป็นผลิตภัณฑ์ร่วม ดังนั้นจึงอาจ จำกัด ตัวเลือกในการจัดลำดับใหม่ของ JOIN