SQL Server Query Store - การสืบค้นคำว่า 'เฉพาะกิจ' คืออะไร


10

ฉันดำน้ำลึกลงไปใน SQL Server Query Store และฉันมักจะเห็นการอ้างอิงถึงคำสั่ง 'เฉพาะกิจ' อย่างไรก็ตามฉันไม่เห็นสิ่งที่ Query Store กำหนดคิวรีแบบเฉพาะกิจ ฉันเคยเห็นสถานที่ที่สามารถอนุมานได้ว่าเป็นแบบสอบถามโดยไม่มีพารามิเตอร์หรือแบบสอบถามดำเนินการเพียงครั้งเดียว คำจำกัดความที่เป็นทางการมีอยู่สำหรับสิ่งนี้หรือไม่? โดยทั่วไปฉันไม่ได้ตั้งใจ ฉันหมายถึงมันเกี่ยวข้องกับ Query Store

ตัวอย่างเช่นหน้านี้แสดงตัวอย่างของการลบแบบสอบถาม ad-hoc ออกจากที่เก็บแบบสอบถาม แต่ปรากฏว่าเกณฑ์ที่ใช้คือการนับการดำเนินการเพียงครั้งเดียว นี่ดูเหมือนจะเป็นคำจำกัดความที่แปลกประหลาดของคำค้นหาเฉพาะกิจ BTW หากคุณไปที่หน้าให้ค้นหา 'ลบคำค้นหาแบบเฉพาะกิจ'



@SqlWorldWide - ฉันได้ตั้งคำถามใหม่แล้ว โดยทั่วไปฉันไม่ได้ตั้งใจ ฉันหมายถึงมันเกี่ยวข้องกับ Query Store
Randy Minder

ที่เก็บแบบสอบถามของคุณมีการกำหนดค่าอย่างไร - ทั้งหมดหรืออัตโนมัติ
Kin Shah

@Kin - ตั้งเป็น Auto
Randy Minder

คำตอบ:


8

หลังจากการค้นหาเล็กน้อยฉันไม่สามารถหาแหล่งข้อมูลที่เป็นรูปธรรมและน่าพอใจจากเอกสารของ 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 ฟังก์ชั่นทริกเกอร์ ฯลฯ )
  • แบบสอบถามที่เหมือนกันจะดำเนินการเพียงครั้งเดียวหรือแบบสอบถามที่เหมือนกันจะดำเนินการหลายครั้ง แต่สร้างแผนแบบสอบถามที่แตกต่างกันสำหรับการดำเนินการแต่ละครั้งที่ตามมา

4

สำหรับคิวรีแบบเฉพาะกิจคอลัมน์object_idในsys.query_store_queryDMV จะเป็น 0 ตามที่ระบุไว้ในเอกสาร sys.query_store_query :

object_id :

ID ของวัตถุฐานข้อมูลที่แบบสอบถามเป็นส่วนหนึ่งของ (กระบวนงานที่เก็บไว้ทริกเกอร์ CLR UDF / UDAgg เป็นต้น) 0 ถ้าแบบสอบถามไม่ได้ดำเนินการเป็นส่วนหนึ่งของวัตถุฐานข้อมูล (แบบสอบถามเฉพาะกิจ)

คุณสามารถระบุคำถามเฉพาะกิจขึ้นอยู่กับค่าที่แม้ว่ามันจะไม่ได้ระบุไว้อย่างชัดเจนว่า "นี่คือนิยามของ Ad-hoc คำสั่ง " :)


0

คำศัพท์เฉพาะกิจใช้เพื่ออ้างถึงข้อความค้นหาที่ถูกเรียกใช้งานเพียงครั้งเดียว สิ่งนี้สอดคล้องกับคำจำกัดความที่ใช้สำหรับการตั้งค่าฐานข้อมูล "ปรับให้เหมาะสมสำหรับภาระงานแบบเฉพาะกิจ"

ลิงก์ที่คุณอ้างอิงถึงการลบคิวรีแบบเฉพาะกิจมีคำจำกัดความเฉพาะนี้ "ลบคิวรีแบบเฉพาะกิจ: นี่เป็นการลบคิวรีที่ถูกเรียกใช้งานเพียงครั้งเดียวเท่านั้นและมีอายุมากกว่า 24 ชั่วโมง"


0

Ad-hoc จากคอลัมน์sys.dm_exec_cached_plans dmv objtypeใน docs.microsoft.com

Adhoc: แบบสอบถามเฉพาะกิจ อ้างถึง Transact-SQL ที่ส่งเป็นกิจกรรมภาษาโดยใช้ osql หรือ sqlcmd แทนที่จะเป็นการเรียกขั้นตอนระยะไกล

Adhocหนึ่งใช้ของคอลัมน์นี้คือการเห็นในกรณีของแบบสอบถามมีแผนหลายเพื่อดูว่าหลายแผนการที่เกิดจาก

    SELECT  DISTINCT 
        QCP.objtype
        ,MultipleQ.PlanCount
        ,qStat.query_hash
        ,sText.text AS QueryText
FROM ( 
        SELECT query_hash,
               COUNT(query_hash) AS PlanCount
        FROM sys.dm_exec_query_stats
        GROUP BY query_hash
    ) AS MultipleQ
INNER JOIN sys.dm_exec_query_stats qStat ON MultipleQ.query_hash = qStat.query_hash
INNER JOIN sys.dm_exec_cached_plans  QCP
    ON QCP.plan_handle = qStat.plan_handle
CROSS APPLY sys.dm_exec_sql_text(qStat.sql_handle) AS sText
CROSS APPLY sys.dm_exec_query_plan(qStat.plan_handle) AS qp
WHERE PlanCount > 1
ORDER BY MultipleQ.PlanCount DESC

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