5

Microsoft SQL Server では、「最悪の」ストアド プロシージャを見つける方法が複数あると聞きました。実行回数、CPU ワーカー時間、キュー待機時間などです。

最悪の (最も遅い/最も使用されている) UDF を見つける方法を探しています -- そのための DMV クエリはありますか?

たとえば、あなたをスーパーヒーローにする 5 つの DMV クエリのこのクエリは、合計ワーカー時間で上位 25 のキャッシュされた SP を返します。

UDF に対してこのようなものを記述するにはどうすればよいですか?

SELECT TOP(25) p.name AS [SP Name], qs.total_worker_time AS [TotalWorkerTime], 
qs.total_worker_time/qs.execution_count AS [AvgWorkerTime], qs.execution_count, 
ISNULL(qs.execution_count/DATEDIFF(Second, qs.cached_time, GETDATE()), 0) AS [Calls/Second],
qs.total_elapsed_time, qs.total_elapsed_time/qs.execution_count 
AS [avg_elapsed_time], qs.cached_time
FROM sys.procedures AS p
INNER JOIN sys.dm_exec_procedure_stats AS qs
ON p.[object_id] = qs.[object_id]
WHERE qs.database_id = DB_ID()
ORDER BY qs.total_worker_time DESC OPTION (RECOMPILE);
4

3 に答える 3

2

これは、ストアド プロシージャ、トリガー、関数などのステートメントを含むオブジェクトの名前を持つ、パフォーマンスが最も悪い上位 100 の SQL ステートメントを見つける別の方法です。これはコンテキストで実行されるため、SSMS を実行する DB に切り替えるか、ステートメントを配置する必要がありますUSE DB。また、DB を再起動すると、DMV 統計がリセットされるため、「0」行が返される場合があります...


SELECT  TOP 100
            [Object_Name] = object_name(st.objectid),
            creation_time, 
            last_execution_time, 
            total_cpu_time = total_worker_time / 1000, 
            avg_cpu_time = (total_worker_time / execution_count) / 1000,
            min_cpu_time = min_worker_time / 1000,
            max_cpu_time = max_worker_time / 1000,
            last_cpu_time = last_worker_time / 1000,
            total_time_elapsed = total_elapsed_time / 1000 , 
            avg_time_elapsed = (total_elapsed_time / execution_count) / 1000, 
            min_time_elapsed = min_elapsed_time / 1000, 
            max_time_elapsed = max_elapsed_time / 1000, 
            avg_physical_reads = total_physical_reads / execution_count,
            avg_logical_reads = total_logical_reads / execution_count,
            execution_count, 
            SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
                  (
                        (
                              CASE statement_end_offset
                                    WHEN -1 THEN DATALENGTH(st.text)
                                    ELSE qs.statement_end_offset
                              END 
                              - qs.statement_start_offset
                        ) /2
                  ) + 1
            ) as statement_text
FROM 
            sys.dm_exec_query_stats qs
CROSS APPLY 
            sys.dm_exec_sql_text(qs.sql_handle) st
WHERE
            Object_Name(st.objectid) IS NOT NULL
            AND st.dbid = DB_ID()
ORDER BY 
            db_name(st.dbid), 
            total_worker_time / execution_count  DESC


于 2011-05-12T02:53:30.253 に答える
2

これを試して。

上記のコードは、ストアド プロシージャのみに制限します

注:「sys.functions」はありません

于 2011-05-14T11:48:11.867 に答える