ฉันจะตรวจสอบจำนวนการโทรต่อขั้นตอนการจัดเก็บต่อช่วงเวลาได้อย่างไร


10

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

คำตอบ:


17

คุณสามารถรับสิ่งนี้ (และอื่น ๆ ) จากDynamic Management Views (DMVs) หากต้องการรับสถิติสำหรับกระบวนงานที่เก็บไว้โดยเฉพาะลองใช้แบบสอบถามต่อไปนี้

SELECT
    OBJECT_NAME(qt.objectid)
  , qs.execution_count AS [Execution Count]
  , qs.execution_count / DATEDIFF(Second, qs.creation_time, GETDATE()) AS [Calls/Second]
  , qs.total_worker_time / qs.execution_count AS [AvgWorkerTime]
  , qs.total_worker_time AS [TotalWorkerTime]
  , qs.total_elapsed_time / qs.execution_count AS [AvgElapsedTime]
  , qs.max_logical_reads
  , qs.max_logical_writes
  , qs.total_physical_reads
  , DATEDIFF(Minute, qs.creation_time, GETDATE()) AS [Age in Cache]
FROM
    sys.dm_exec_query_stats AS qs
CROSS APPLY 
    sys.dm_exec_sql_text(qs.[sql_handle]) AS qt
WHERE
    qt.[dbid] = DB_ID()
AND qt.objectid = OBJECT_ID('StoredProcedureName')
OPTION (RECOMPILE);

เมื่อต้องการดูโพรซีเดอร์ที่เรียกใช้บ่อยที่สุด:

SELECT
    OBJECT_NAME(qt.objectid)
  , qs.execution_count AS [Execution Count]
  , qs.execution_count / DATEDIFF(Second, qs.creation_time, GETDATE()) AS [Calls/Second]
  , qs.total_worker_time / qs.execution_count AS [AvgWorkerTime]
  , qs.total_worker_time AS [TotalWorkerTime]
  , qs.total_elapsed_time / qs.execution_count AS [AvgElapsedTime]
  , qs.max_logical_reads
  , qs.max_logical_writes
  , qs.total_physical_reads
  , DATEDIFF(Minute, qs.creation_time, GETDATE()) AS [Age in Cache]
FROM
    sys.dm_exec_query_stats AS qs
CROSS APPLY 
    sys.dm_exec_sql_text(qs.[sql_handle]) AS qt
WHERE
    qt.[dbid] = DB_ID()
ORDER BY
    qs.execution_count DESC
OPTION (RECOMPILE);

ค่าที่รายงานจะถูกสะสมตั้งแต่การรีสตาร์ทครั้งล่าสุด หากคุณต้องการวัดในช่วงเวลาที่กำหนดให้ใช้คำสั่งด้านล่างเพื่อรีเซ็ตสถานะการรอ

DBCC SQLPERF("sys.dm_os_wait_stats",CLEAR);

หากคุณต้องการวัด timespans คงที่ตลอดทั้งวันคุณสามารถป้อนผลลัพธ์แบบสอบถามไปยังตารางผ่านงานตัวแทนและ a) คำนวณค่าระหว่างสองการรันหรือ b) ออกการรอสถิติตั้งค่าเป็นขั้นตอนสุดท้ายในงานตัวแทน .

ผลัดกันจับร่องรอย Profiler และเรียกใช้ผ่านล้าง Trace


ดูเหมือนว่าฉันจะได้รับชุดผลลัพธ์มากมาย แต่ไม่เหมือนกัน ตัวอย่างเช่นฉันเห็นภายใต้คอลัมน์ object_name ตอบสนองหลาย ๆ วัตถุเดียวกัน แต่รายละเอียดส่วนใหญ่เหมือนกันโดยมีข้อยกเว้นเล็กน้อย รายละเอียดคอลัมน์ที่ตรงกับ: ExecutionCount, การโทร / วินาที, AgeInCache รายละเอียดคอลัมน์ที่ไม่ตรงกัน: AvgWorkerTime, TotalWorkerTime, AvgElapesedTime อะไรจะทำให้เกิดผลลัพธ์มากมายต่อหลายคน?
kstubs
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.