Làm cách nào tôi có thể theo dõi số lượng cuộc gọi trên mỗi thủ tục được lưu trữ trên mỗi lần?


10

Để chẩn đoán một số vấn đề về hiệu năng, tôi muốn hiểu rõ hơn về số lần các thủ tục nhất định được gọi so với hiệu suất hệ thống. Có cách nào để có được số lần mỗi thủ tục được gọi trong một khoảng thời gian nhất định không?

Câu trả lời:


17

Bạn có thể nhận được điều này (và hơn thế nữa) từ Chế độ xem quản lý động (DMV). Để có được số liệu thống kê cho một thủ tục được lưu trữ cụ thể, hãy thử truy vấn sau đây.

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);

Để xem các thủ tục được thực hiện thường xuyên nhất:

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);

Các giá trị được báo cáo được tích lũy kể từ lần khởi động lại cuối cùng. Nếu bạn muốn đo trong một khoảng thời gian cố định, hãy sử dụng lệnh bên dưới để đặt lại số liệu thống kê chờ.

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

Nếu bạn muốn đo thời gian cố định trong cả ngày, bạn có thể cung cấp đầu ra truy vấn cho một bảng thông qua công việc đại lý và a) tính giá trị giữa hai lần chạy hoặc b) đưa ra chỉ số chờ đợi là bước cuối cùng trong công việc đại lý .

Ngoài ra, chụp dấu vết hồ sơ và chạy nó qua Clear Trace .


Có vẻ như tôi đang nhận được rất nhiều kết quả nhưng không chính xác. Ví dụ, tôi thấy bên dưới cột object_name trả lời một số đối tượng giống nhau nhưng hầu hết các chi tiết đều giống nhau với một vài ngoại lệ. Các chi tiết cột khớp với: ExecutCount, Call / Second, AgeInCache. Các chi tiết cột không khớp: AverageWorkerTime, TotalWorkerTime, AverageElapesedTime. Điều gì sẽ gây ra nhiều kết quả?
kstub
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.