หลังจากการค้นหาเล็กน้อยฉันไม่สามารถหาแหล่งข้อมูลที่เป็นรูปธรรมและน่าพอใจจากเอกสารของ Microsoft เพื่อตอบคำถามนี้ มีคำอธิบายของบุคคลที่สามที่ดีมากมายและคำจำกัดความของ adhoc / ad-hoc / ad hoc ออกมี แต่สำหรับความจำเพาะของคำถามนี้ฉันคิดว่าหนึ่งใกล้แหล่งที่มาเหมาะ
การย้ายคำจำกัดความทั่วไป (แต่ยังคงถูกต้อง) ในอดีตเช่นโพสต์ SO นี้ (ขอบคุณ SqlWorldWide) ถ้าเราดูว่าเอกสารพูดอะไรในหัวข้อนั้นจะเห็นด้วยกับสิ่งที่คุณพูดถึงคำนิยามที่อิงจากจำนวนการประหารชีวิต ฉันคิดว่าถึงจุดที่เราสามารถใช้มันเป็นความจริง
บทความเกี่ยวกับการเพิ่มประสิทธิภาพสำหรับเวิร์กโฟลว์เฉพาะกิจกล่าวว่า
เมื่อตัวเลือกนี้ถูกตั้งค่าเป็น 1 โปรแกรมฐานข้อมูลจะเก็บ stub แผนเรียบเรียงขนาดเล็กลงในแคชแผนเมื่อแบทช์ถูกรวบรวมเป็นครั้งแรกแทนที่จะเป็นแผนคอมไพล์เต็ม สิ่งนี้จะช่วยลดแรงกดดันหน่วยความจำโดยไม่อนุญาตให้แคชแผนเต็มไปด้วยแผนคอมไพล์ที่ไม่ได้ใช้ซ้ำ stub แผนที่คอมไพล์ทำให้ฐานข้อมูล Engine รับรู้ว่าแบตช์เฉพาะกิจนี้ได้ถูกรวบรวมมาก่อน แต่ได้เก็บ stub แผนที่คอมไพล์ไว้เท่านั้นดังนั้นเมื่อแบตช์นี้ถูกเรียกใช้ (รวบรวมหรือดำเนินการ) อีกครั้ง Engine Database รวบรวมแบตช์ ... และเพิ่มแผนเรียบเรียงแบบเต็มไปยังแคชแผน
ดังนั้นมันจะปรากฏตัวเลือกการกำหนดค่าเซิร์ฟเวอร์แบบสอบถาม ad hoc ยังใช้คำจำกัดความของการดำเนินการเดียวเป็นคำจำกัดความของเฉพาะกิจ หากแบบสอบถามยังคงได้รับการดำเนินการและสร้างแผนเดียวกันมันจะไม่ได้รับการปฏิบัติเช่นนั้นอีกต่อไป
บทความเกี่ยวกับวิธีปฏิบัติที่ดีที่สุดสำหรับ Query Storeยังสอดคล้องกับสิ่งนี้
เปรียบเทียบจำนวนค่า query_hash ที่แตกต่างกับจำนวนรายการทั้งหมดใน sys.query_store_query หากอัตราส่วนใกล้เคียงกับ 1 ปริมาณงานเฉพาะกิจของคุณจะสร้างคิวรีที่แตกต่างกัน
แน่นอนว่านี่เป็นคำสั่งที่ไม่ได้ใช้เป็นขั้นตอนการจัดเก็บการกำหนดพารามิเตอร์และอื่น ๆ เพราะพวกเขาสามารถรับรู้และปฏิบัติอย่างเหมาะสมทันทีจากค้างคาว
จากทั้งหมดนี้เราสามารถพูดได้ว่าแบบสอบถามนั้นถือว่าเป็นเฉพาะกิจหาก:
- มันไม่ได้เป็นพารามิเตอร์
- มันไม่ได้ถูกจัดเก็บทางโปรแกรมในฐานข้อมูล (เก็บไว้ proc ฟังก์ชั่นทริกเกอร์ ฯลฯ )
- แบบสอบถามที่เหมือนกันจะดำเนินการเพียงครั้งเดียวหรือแบบสอบถามที่เหมือนกันจะดำเนินการหลายครั้ง แต่สร้างแผนแบบสอบถามที่แตกต่างกันสำหรับการดำเนินการแต่ละครั้งที่ตามมา