พื้นหลัง
ฉันมีแบบสอบถามที่ใช้กับ SQL Server 2008 R2 ที่รวมและ / หรือซ้ายเข้าร่วมกับ "ตาราง" ที่แตกต่างกันประมาณ 12 รายการ ฐานข้อมูลมีขนาดค่อนข้างใหญ่โดยมีตารางมากกว่า 50 ล้านแถวและประมาณ 300 ตารางที่แตกต่างกัน สำหรับ บริษัท ขนาดใหญ่ที่มีคลังสินค้า 10 แห่งทั่วประเทศ คลังสินค้าทั้งหมดอ่านและเขียนไปยังฐานข้อมูล ดังนั้นมันจึงค่อนข้างใหญ่และค่อนข้างยุ่ง
ข้อความค้นหาที่ฉันพบมีลักษณะดังนี้:
select t1.something, t2.something, etc.
from Table1 t1
inner join Table2 t2 on t1.id = t2.t1id
left outer join (select * from table 3) t3 on t3.t1id = t1.t1id
[etc]...
where t1.something = 123
ขอให้สังเกตว่าหนึ่งในการรวมอยู่ในแบบสอบถามย่อยที่ไม่เกี่ยวข้อง
ปัญหาคือการเริ่มต้นเมื่อเช้านี้โดยไม่มีการเปลี่ยนแปลงใด ๆ (ที่ฉันหรือใครก็ได้ในทีมของฉันรู้) ไปยังระบบการสืบค้นซึ่งโดยปกติจะใช้เวลาประมาณ 2 นาทีในการเริ่มต้นใช้เวลาหนึ่งชั่วโมงครึ่งในการทำงาน วิ่งเลย ส่วนที่เหลือของฐานข้อมูลนั้นฮัมเพลงไปด้วยดี ฉันได้ลบแบบสอบถามนี้ออกจาก sproc ที่มันมักจะทำงานในและฉันจะเรียกใช้มันใน SSMS w / ตัวแปรพารามิเตอร์รหัสตายยากกับความช้าเหมือนกัน
ความแปลกคือเมื่อฉันนำคิวรีย่อยที่ไม่สัมพันธ์และโยนลงในตารางชั่วคราวแล้วใช้แทนคิวรีย่อยแบบสอบถามจะทำงานได้ดี นอกจากนี้ (และนี่คือสิ่งที่แปลกที่สุดสำหรับฉัน) หากฉันเพิ่มโค้ดส่วนนี้ลงในส่วนท้ายของคิวรีแบบสอบถามจะทำงานได้อย่างยอดเยี่ยม:
and t.name like '%'
ฉันได้ข้อสรุป (อาจไม่ถูกต้อง) จากการทดลองเล็กน้อยเหล่านี้ว่าสาเหตุของการชะลอตัวนั้นเกิดจากการตั้งค่าแผนการดำเนินการแคชของ SQL - เมื่อแบบสอบถามแตกต่างกันเล็กน้อยก็ต้องสร้างแผนปฏิบัติการใหม่
คำถามของฉันคือ:เมื่อแบบสอบถามที่ใช้ในการเรียกใช้อย่างรวดเร็วเริ่มทำงานช้าในกลางดึกและไม่มีอะไรได้รับผลกระทบใดนอกจากแบบสอบถามนี้ฉันจะแก้ไขปัญหาได้อย่างไรและฉันจะป้องกันไม่ให้เกิดขึ้นในอนาคตได้อย่างไร ? ฉันจะรู้ได้อย่างไรว่า SQL กำลังทำอะไรภายในเพื่อทำให้มันช้ามาก (ถ้าเคียวรีไม่ดีฉันสามารถรับแผนปฏิบัติการได้ แต่จะไม่ทำงาน - บางทีแผนปฏิบัติการที่คาดหวังจะให้บางอย่างกับฉัน)? หากปัญหานี้อยู่ในแผนการดำเนินการฉันจะป้องกันไม่ให้ SQL คิดว่าแผนการดำเนินการที่เลวร้ายจริงๆเป็นความคิดที่ดีได้อย่างไร
และนี่ไม่ใช่ปัญหากับการดมพารามิเตอร์ ฉันเคยเห็นมาก่อนและนี่ไม่ใช่เพราะแม้เมื่อฉันเขียนโค้ด varaibles ใน SSMS ฉันก็ยังได้รับประสิทธิภาพที่ช้า