เพื่อที่จะวินิจฉัยปัญหาด้านประสิทธิภาพบางอย่างฉันต้องการทำความเข้าใจเกี่ยวกับจำนวนครั้งที่โพรซีเดอร์บางอย่างถูกเรียกเมื่อเปรียบเทียบกับประสิทธิภาพของระบบ มีวิธีรับจำนวนครั้งที่แต่ละโพรซีเดอร์ถูกเรียกระหว่างช่วงเวลาหนึ่งหรือไม่?
เพื่อที่จะวินิจฉัยปัญหาด้านประสิทธิภาพบางอย่างฉันต้องการทำความเข้าใจเกี่ยวกับจำนวนครั้งที่โพรซีเดอร์บางอย่างถูกเรียกเมื่อเปรียบเทียบกับประสิทธิภาพของระบบ มีวิธีรับจำนวนครั้งที่แต่ละโพรซีเดอร์ถูกเรียกระหว่างช่วงเวลาหนึ่งหรือไม่?
คำตอบ:
คุณสามารถรับสิ่งนี้ (และอื่น ๆ ) จาก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