ความแตกต่างของอนุสาวรีย์ในเวลาดำเนินการระหว่างแบบสอบถามเมื่อใช้คำใบ้แบบสอบถาม RECOMPILE


16

ฉันมีแบบสอบถามที่เหมือนกันเกือบสองรายการที่ทำงานบนอินสแตนซ์ SQL Server 2005 เดียวกัน:

  1. อันแรกคือSELECTเคียวรีดั้งเดิมตามที่สร้างโดย LINQ (ฉันรู้ว่าฉันรู้ ... ฉันไม่ใช่นักพัฒนาแอปพลิเคชันเพียง DBA :)
  2. คนที่สองเหมือนกันกับคนแรกที่เพิ่มOPTION (RECOMPILE)ในตอนท้าย

ไม่มีอะไรเปลี่ยนแปลง

คนแรกใช้เวลา 55 วินาทีทุกครั้งที่วิ่ง
คนที่สองใช้เวลา 2 วินาที

ชุดผลลัพธ์ทั้งคู่เหมือนกัน

ทำไมคำใบ้นี้ทำให้เกิดประสิทธิภาพที่เพิ่มขึ้นอย่างมาก?

รายการหนังสือออนไลน์บนRECOMPILEไม่มีคำอธิบายโดยละเอียดมาก:

สั่งให้โปรแกรมฐานข้อมูลเซิร์ฟเวอร์ SQL เพื่อยกเลิกแผนที่สร้างขึ้นสำหรับแบบสอบถามหลังจากที่ดำเนินการบังคับให้เครื่องมือเพิ่มประสิทธิภาพแบบสอบถามเพื่อรวบรวมแผนแบบสอบถามอีกครั้งในครั้งถัดไปที่ดำเนินการแบบสอบถามเดียวกัน โดยไม่ต้องระบุ RECOMPILE เครื่องมือฐานข้อมูลจะเก็บแผนแบบสอบถามและนำมาใช้ใหม่ เมื่อรวบรวมแผนแบบสอบถามคำแนะนำแบบสอบถาม RECOMPILE ใช้ค่าปัจจุบันของตัวแปรท้องถิ่นใด ๆ ในแบบสอบถามและหากแบบสอบถามอยู่ภายในกระบวนงานที่เก็บไว้ค่าปัจจุบันจะถูกส่งไปยังพารามิเตอร์ใด ๆ

RECOMPILE เป็นทางเลือกที่มีประโยชน์ในการสร้างโพรซีเดอร์ที่เก็บไว้ซึ่งใช้ส่วนคำสั่ง WITH RECOMPILE เมื่อมีคิวรีย่อยของเคียวรีภายในโพรซีเดอร์ที่เก็บไว้เท่านั้นแทนที่จะต้องคอมไพล์ที่เก็บไว้ทั้งหมด สำหรับข้อมูลเพิ่มเติมโปรดดูการคอมไพล์ใหม่ของกระบวนงานที่เก็บไว้ RECOMPILE ยังมีประโยชน์เมื่อคุณสร้างแผนที่นำทาง สำหรับข้อมูลเพิ่มเติมดูการปรับการค้นหาในแอปพลิเคชันที่ปรับใช้โดยใช้คำแนะนำแผน

เนื่องจากแบบสอบถามของฉันมีตัวแปรในเครื่องจำนวนมากฉันเดาว่า SQL Server สามารถปรับให้เหมาะสม (อย่างจริงจัง) เมื่อฉันใช้OPTION (RECOMPILE)คำใบ้แบบสอบถาม

ทุกที่ที่ฉันมองคนกำลังบอกว่าOPTION (RECOMPILE)ควรหลีกเลี่ยง คำอธิบายโดยทั่วไปคือการใช้คำแนะนำนี้ SQL Server จะไม่สามารถใช้แผนการ exection ซ้ำได้ดังนั้นจึงต้องเสียเวลาในการคอมไพล์ซ้ำทุกครั้ง
(แต่) ด้วยความได้เปรียบด้านประสิทธิภาพอันยิ่งใหญ่ฉันมีแนวโน้มที่จะคิดว่าการใช้คำใบ้แบบสอบถามนี้ในครั้งนี้จะเป็นสิ่งที่ดี

ฉันควรใช้หรือไม่ ถ้าไม่มีมีวิธีที่ฉันสามารถบังคับให้ SQL Server ใช้แผนการดำเนินการที่ดีกว่าโดยไม่มีคำใบ้นี้และไม่มีการเปลี่ยนแปลงแอปพลิเคชันหรือไม่

คำตอบ:


16

ตามที่ระบุไว้ในบทความสถิติที่ใช้โดยเครื่องมือเพิ่มประสิทธิภาพข้อความค้นหาใน Microsoft SQL Server 2005

หากคุณใช้ตัวแปรโลคัลในเพรดิเคตเคียวรีแทนพารามิเตอร์หรือตัวอักษรตัวออปติไมซ์จะทำการประมาณคุณภาพที่ลดลงหรือเดาการเลือกของเพรดิเคต ใช้พารามิเตอร์หรือสัญพจน์ในเคียวรีแทนตัวแปรโลคัล

เมื่อเครื่องมือเพิ่มประสิทธิภาพไม่มีสถิติที่ใช้งานได้เลยสำหรับคอลัมน์มันจะเดาว่าเพรดิเคต=จะตรงกับ 10% ของแถวBETWEEN9% และใด ๆ ที่>, >=, < and <=จะตรงกับ 30% หากมีสถิติคอลัมน์=แสดงว่าคำกริยาจะได้รับการปฏิบัติแตกต่างกันดังนี้

แม้ว่าจะมีการใช้ตัวแปรท้องถิ่นในแบบสอบถามการประมาณการที่ดีกว่าการคาดเดาจะใช้ในกรณีของภาคที่เท่าเทียมกัน ความจำเพาะสำหรับเงื่อนไขของแบบฟอร์ม " @local_variable = column_name" ถูกประเมินโดยใช้ความถี่ค่าเฉลี่ยจากฮิสโตแกรมสำหรับ column_name ตัวอย่างเช่นหากคอลัมน์ column_name มีค่าที่ไม่ซ้ำกันทั้งหมด1/(number of unique values in column)จะมีการใช้การประมาณค่าการเลือกซึ่งถูกต้อง

OPTIMIZE FOR (UNKNOWN)ดังนั้นนี้เป็นหลักเช่นเดียวกับที่ใช้สำหรับ อาจมีความแม่นยำมากกว่าการ10%เดาแบบคงที่ แต่ไม่ได้ปรับให้เหมาะกับค่าเฉพาะที่คุณทำการสืบค้น

ในการบังคับให้ SQL Server ปรับการสืบค้นทุกครั้งที่มีการเรียกใช้และใช้ค่าของตัวแปรในเครื่องเพื่อประเมินความสำคัญและต้นทุนระหว่างการเพิ่มประสิทธิภาพของแบบสอบถามให้เพิ่มRECOMPILEคำใบ้ของแบบสอบถามลงในแบบสอบถาม

ด้วยการใช้งานของRECOMPILEคุณน่าจะได้รับการประเมินความถูกต้องของ cardinality ที่แม่นยำยิ่งขึ้นดังนั้นแผนที่แตกต่างกับการเข้าร่วมการสั่งซื้อ / การเข้าร่วมประเภทที่เหมาะสมกับจำนวนแถวที่ส่งคืนจากส่วนต่างๆของแบบสอบถามจริงของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.