как получить все время выполнения хранимой процедуры, время чашки и т. Д

#sql-server #database #stored-procedures #database-performance

#sql-сервер #База данных #хранимые процедуры #база данных-производительность

Вопрос:

  SELECT DB_NAME(st.dbid) DBName
      ,OBJECT_SCHEMA_NAME(objectid,st.dbid) SchemaName
      ,OBJECT_NAME(objectid,st.dbid) StoredProcedure
      ,max(cp.usecounts) execution_count
      ,sum(qs.total_elapsed_time) total_elapsed_time
      ,sum(qs.total_elapsed_time) / max(cp.usecounts) avg_elapsed_time
 FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.plan_handle) st
   join sys.dm_exec_cached_plans cp on qs.plan_handle = cp.plan_handle
 where  cp.objtype = 'proc'
 group by DB_NAME(st.dbid),OBJECT_SCHEMA_NAME(objectid,st.dbid), OBJECT_NAME(objectid,st.dbid) 
 order by sum(qs.total_elapsed_time) desc
 

Я выполняю вышеуказанный запрос, но не могу найти все детали списка SP, которые создаются в базе данных.
Он показывает только меньшее количество SP.

Пожалуйста, помогите мне. Жду вашего ценного ответа.

Комментарии:

1. Не каждая хранимая процедура будет иметь запись в sys.dm_exec_cached_plans

Ответ №1:

Вы могли бы попробовать что-то подобное, намного сложнее, но это связано с тем, что не каждая хранимая процедура будет иметь статистику:

 CREATE TABLE #x(
    database_id INT, 
    DatabaseName SYSNAME, 
    SchemaName SYSNAME, 
    ProcedureName SYSNAME, 
    [object_id] INT);
DECLARE @sql NVARCHAR(MAX) = '';
SELECT 
    @sql = @sql   N'INSERT INTO #x SELECT '   CONVERT(VARCHAR(50), d.database_id)   ', '''   name   ''', s.name, p.name, p.[object_id]
    FROM '   QUOTENAME(d.name)   '.sys.schemas AS s
    INNER JOIN '   QUOTENAME(d.name)   '.sys.procedures AS p ON p.schema_id = s.schema_id;' FROM sys.databases d WHERE d.database_id > 4;
EXEC sp_executesql @sql;

WITH PlanData AS (
SELECT
    st.[dbid] AS database_id,
    st.objectid AS [object_id],
    DB_NAME(st.[dbid]) AS DBName,
    OBJECT_SCHEMA_NAME(st.objectid, st.[dbid]) AS SchemaName,
    OBJECT_NAME(st.objectid, st.[dbid]) AS StoredProcedure,
    MAX(cp.usecounts) AS execution_count,
    SUM(qs.total_elapsed_time) AS total_elapsed_time,
    SUM(qs.total_elapsed_time) / MAX(cp.usecounts) AS avg_elapsed_time
 FROM
    sys.dm_exec_query_stats qs
    CROSS APPLY sys.dm_exec_sql_text(qs.plan_handle) st
    LEFT JOIN sys.dm_exec_cached_plans cp on cp.plan_handle = qs.plan_handle
WHERE
    cp.objtype = 'PROC'
GROUP BY
    st.[dbid],
    st.objectid,
    DB_NAME(st.[dbid]),
    OBJECT_SCHEMA_NAME(st.objectid, st.[dbid]), 
    OBJECT_NAME(st.objectid, st.[dbid]))
SELECT 
    x.DatabaseName,
    x.SchemaName,
    x.ProcedureName,
    pd.execution_count,
    pd.total_elapsed_time,
    pd.avg_elapsed_time
FROM 
    #x x
    LEFT JOIN PlanData pd ON pd.database_id = x.database_id AND pd.[object_id] = x.[object_id];
DROP TABLE #x;
 

Из MSDN относительно sys.dm_exec_query_stats: «Представление содержит одну строку для каждого оператора запроса в кэшированном плане, а время жизни строк привязано к самому плану. Когда план удаляется из кэша, соответствующие строки удаляются из этого представления. »