ฉันมีแบบสอบถามที่เหมือนกันเกือบสองรายการที่ทำงานบนอินสแตนซ์ SQL Server 2005 เดียวกัน:
- อันแรกคือ
SELECT
เคียวรีดั้งเดิมตามที่สร้างโดย LINQ (ฉันรู้ว่าฉันรู้ ... ฉันไม่ใช่นักพัฒนาแอปพลิเคชันเพียง DBA :) - คนที่สองเหมือนกันกับคนแรกที่เพิ่ม
OPTION (RECOMPILE)
ในตอนท้าย
ไม่มีอะไรเปลี่ยนแปลง
คนแรกใช้เวลา 55 วินาทีทุกครั้งที่วิ่ง
คนที่สองใช้เวลา 2 วินาที
ชุดผลลัพธ์ทั้งคู่เหมือนกัน
ทำไมคำใบ้นี้ทำให้เกิดประสิทธิภาพที่เพิ่มขึ้นอย่างมาก?
รายการหนังสือออนไลน์บนRECOMPILE
ไม่มีคำอธิบายโดยละเอียดมาก:
สั่งให้โปรแกรมฐานข้อมูลเซิร์ฟเวอร์ SQL เพื่อยกเลิกแผนที่สร้างขึ้นสำหรับแบบสอบถามหลังจากที่ดำเนินการบังคับให้เครื่องมือเพิ่มประสิทธิภาพแบบสอบถามเพื่อรวบรวมแผนแบบสอบถามอีกครั้งในครั้งถัดไปที่ดำเนินการแบบสอบถามเดียวกัน โดยไม่ต้องระบุ RECOMPILE เครื่องมือฐานข้อมูลจะเก็บแผนแบบสอบถามและนำมาใช้ใหม่ เมื่อรวบรวมแผนแบบสอบถามคำแนะนำแบบสอบถาม RECOMPILE ใช้ค่าปัจจุบันของตัวแปรท้องถิ่นใด ๆ ในแบบสอบถามและหากแบบสอบถามอยู่ภายในกระบวนงานที่เก็บไว้ค่าปัจจุบันจะถูกส่งไปยังพารามิเตอร์ใด ๆ
RECOMPILE เป็นทางเลือกที่มีประโยชน์ในการสร้างโพรซีเดอร์ที่เก็บไว้ซึ่งใช้ส่วนคำสั่ง WITH RECOMPILE เมื่อมีคิวรีย่อยของเคียวรีภายในโพรซีเดอร์ที่เก็บไว้เท่านั้นแทนที่จะต้องคอมไพล์ที่เก็บไว้ทั้งหมด สำหรับข้อมูลเพิ่มเติมโปรดดูการคอมไพล์ใหม่ของกระบวนงานที่เก็บไว้ RECOMPILE ยังมีประโยชน์เมื่อคุณสร้างแผนที่นำทาง สำหรับข้อมูลเพิ่มเติมดูการปรับการค้นหาในแอปพลิเคชันที่ปรับใช้โดยใช้คำแนะนำแผน
เนื่องจากแบบสอบถามของฉันมีตัวแปรในเครื่องจำนวนมากฉันเดาว่า SQL Server สามารถปรับให้เหมาะสม (อย่างจริงจัง) เมื่อฉันใช้OPTION (RECOMPILE)
คำใบ้แบบสอบถาม
ทุกที่ที่ฉันมองคนกำลังบอกว่าOPTION (RECOMPILE)
ควรหลีกเลี่ยง คำอธิบายโดยทั่วไปคือการใช้คำแนะนำนี้ SQL Server จะไม่สามารถใช้แผนการ exection ซ้ำได้ดังนั้นจึงต้องเสียเวลาในการคอมไพล์ซ้ำทุกครั้ง
(แต่) ด้วยความได้เปรียบด้านประสิทธิภาพอันยิ่งใหญ่ฉันมีแนวโน้มที่จะคิดว่าการใช้คำใบ้แบบสอบถามนี้ในครั้งนี้จะเป็นสิ่งที่ดี
ฉันควรใช้หรือไม่ ถ้าไม่มีมีวิธีที่ฉันสามารถบังคับให้ SQL Server ใช้แผนการดำเนินการที่ดีกว่าโดยไม่มีคำใบ้นี้และไม่มีการเปลี่ยนแปลงแอปพลิเคชันหรือไม่