ปริศนาตัวเพิ่มประสิทธิภาพการสืบค้น SQL Server 2008 R2
เรามีสองตารางทั้งสองมี 9 ล้านแถว 70,000 แถวนั้นแตกต่างกันแถวอื่นจะเหมือนกัน
อย่างรวดเร็ว 13 วินาที
select * from bigtable1
except select * from similar_bigtable2
นี่จะเรียงลำดับเอาต์พุตและยังรวดเร็ว 13 วินาทีเช่นกัน
select * into #q from bigtable1
except select * from similar_bigtable2
select * from #q order by sort_column
ในขณะนี้ช้ามาก:
;with q as (
select * from bigtable1
except select * from similar_bigtable2
)
select * from q order by sort_column
และแม้แต่ "เคล็ดลับ" ที่บางครั้งฉันใช้เพื่อบอกใบ้ SQL Server ว่ามันจำเป็นต้องคำนวณส่วนหนึ่งของแบบสอบถามก่อนที่มันจะย้ายไปไม่ทำงานและส่งผลให้แบบสอบถามช้าเช่นกัน:
;with q as (
select top 100 percent * from bigtable1
except select * from similar_bigtable2
)
select * from q order by sort_column
ดูที่แบบสอบถามแผนเหตุผลไม่ยากที่จะหา:

SQL Server วางแถวไว้สองแถวจำนวน 9 ล้านแถวก่อนแฮชแมตช์ในขณะที่ฉันต้องการเพิ่มแถว 70.000 แถวเดียวหลังจากแถวแฮชแมตช์
ดังนั้นคำถาม: ฉันจะแนะนำให้เครื่องมือเพิ่มประสิทธิภาพการสืบค้นทำเช่นนั้นได้อย่างไร
EXCEPT(เช่นOUTER JOIN) ไหม? ฉันรู้ว่าไวยากรณ์นั้นสะดวกน้อยกว่า แต่คุณอาจเล่นกับ index / join hint ได้ดีกว่านั้น (หรือคุณอาจไม่จำเป็นต้อง) ทางเลือกที่คุณใช้อยู่ตอนนี้ (สิ่งต่างๆลงในตาราง #temp ก่อน) เป็นวิธีแก้ปัญหาสุดท้าย แต่ในบางกรณีเป็นวิธีเดียวที่จะบังคับให้เครื่องมือเพิ่มประสิทธิภาพแยกสองส่วนของแบบสอบถามอย่างสมบูรณ์แบบที่คุณต้องการ