ฉันมีแบบสอบถาม SQL Server 2008 ที่ค่อนข้างซับซ้อน (ประมาณ 200 บรรทัดของ SQL ที่มีความหนาแน่นพอสมควร) ซึ่งไม่ทำงานตามที่ฉันต้องการ เมื่อเวลาผ่านไปประสิทธิภาพจะลดลงจากประมาณ 0.5 วินาทีเป็นประมาณ 2 วินาที
ดูที่แผนการดำเนินการมันค่อนข้างชัดเจนว่าการเรียงลำดับตัวเชื่อมใหม่จะทำให้ประสิทธิภาพดีขึ้น ฉันทำและมันลงไปถึงประมาณ 3 วินาที ตอนนี้แบบสอบถามมีคำแนะนำ "คำสั่งตัวเลือกการบังคับ"และชีวิตเป็นสิ่งที่ดี
ตามมาด้วยฉันวันนี้ล้างฐานข้อมูล ฉันเก็บประมาณ 20% ของแถวที่จะดำเนินการในฐานข้อมูลที่เกี่ยวข้องอื่นใดนอกจากการลบแถว ... แผนปฏิบัติการที่ได้รับการทยอย มันผิดทั้งหมดจำนวนแถวย่อยบางอย่างจะกลับมาและ (ตัวอย่าง) แทนที่ a:
<Hash>
กับ
<NestedLoops Optimized='false' WithUnorderedPrefetch='true'>
ในขณะนี้เวลาของแบบสอบถามเริ่มจากประมาณ. 3 ถึงประมาณ 18 วินาที (!) เพียงเพราะฉันลบแถว หากฉันลบคำใบ้คำค้นหาฉันกลับไปใช้เวลาสอบถามข้อมูลประมาณ 2 วินาที ดีกว่า แต่แย่กว่านั้น
ฉันได้ทำซ้ำปัญหาหลังจากกู้คืนฐานข้อมูลไปยังสถานที่และเซิร์ฟเวอร์หลายแห่ง เพียงลบประมาณ 20% ของแถวจากแต่ละตารางจะทำให้เกิดปัญหานี้เสมอ
- เป็นเรื่องปกติหรือไม่ที่คำสั่งการเข้าร่วมที่ถูกบังคับจะทำให้การประมาณการแบบสอบถามไม่ถูกต้องสมบูรณ์ (และทำให้เวลาในการสืบค้นไม่แน่นอน)
- ฉันควรคาดหวังว่าฉันจะต้องยอมรับประสิทธิภาพการค้นหาย่อยที่ดีที่สุดหรือดูมันเหมือนเหยี่ยวและแก้ไขคำแนะนำการค้นหาด้วยตนเองบ่อยครั้งหรือไม่ หรืออาจจะบอกใบ้ให้ทุกคนเข้าร่วมด้วยเช่นกัน? .3s to 2s เป็นเกมยอดนิยมที่ต้องทำ
- ชัดเจนหรือไม่ว่าทำไมเครื่องมือเพิ่มประสิทธิภาพจึงเกิดขึ้นหลังจากลบแถว? ตัวอย่างเช่น "ใช่ใช้การสแกนตัวอย่างและเนื่องจากฉันเก็บถาวรแถวส่วนใหญ่ก่อนหน้านี้ในประวัติข้อมูลที่ตัวอย่างให้ผลลัพธ์แบบกระจัดกระจาย
หากคุณต้องการดูแผนการดำเนินการโปรดแนะนำสถานที่ที่ฉันสามารถโพสต์ได้ มิฉะนั้นฉันได้ลองชิมบิตที่น่าทึ่งที่สุด นี่คือการประมาณการผิดพลาดขั้นพื้นฐานตัวเลขใน parens คือแถว (โดยประมาณ: จริง)
/ Clustered Index Scan (908:7229)
Nested Loops (Inner Join) --<
\ NonClustered Index Seek (1:7229)
หมายเหตุคาดว่าวงด้านในจะสแกน 908 แถว แต่สแกน 52,258,441 แทน ถ้ามันถูกต้องสาขานี้จะวิ่งประมาณ 2 มิลลิวินาทีมากกว่า 12 วินาที ก่อนที่จะลบแถวการประมาณการการเข้าร่วมภายในนี้ปิดเพียงปัจจัยรวม 2 เท่านั้นและดำเนินการเป็นการจับคู่แบบแฮชบนดัชนีสองคลัสเตอร์