I am in the process of creating a script that would return the resource usage of stored procs in SQL 2005 as there is no "dm_exec_procedure_stats" DMV available in SQL 2005. I have used the following script to achieve it. However when i compare the results, I get less number of rows in SQL 2005. I can see the plan_handle of the proc in exec_cached_plans, but i don't see a sql_handle for it in dm_exec_query_stats.
Under what circumstances would we encounter such a situation.Please find the queries below
-- WITH Procedure Stats
SELECT @@servername
,getdate()
,CASE WHEN q.dbid = 32767 then 'Resource' ELSE DB_NAME(q.dbid)END AS DBName
,OBJECT_NAME(objectid)AS [OBJECT_NAME]
, p.cacheobjtype
, p.objtype
,(highest_cpu_queries.total_worker_time/highest_cpu_queries.execution_count) AS AverageCPU
, highest_cpu_queries.execution_count
, highest_cpu_queries.last_execution_time
FROM sys.dm_exec_procedure_stats AS highest_cpu_queries
inner join sys.dm_exec_cached_plans p on highest_cpu_queries.plan_handle = p.plan_handle
CROSS APPLY sys.dm_exec_sql_text(highest_cpu_queries.plan_handle) AS q
WHERE q.dbid=DB_ID()
ORDER BY AverageCPU DESC
-- WITH Query Stats
SELECT @@servername as ServerName
,getdate() as [Date]
,CASE WHEN dbid = 32767 then 'Resource' ELSE DB_NAME(dbid)END AS DBName
,OBJECT_NAME(objectid)AS [OBJECT_NAME]
,cp.cacheobjtype
,cp.objtype
,SUM(total_worker_time) / MAX(usecounts) AS AVG_CPU
,SUM(total_elapsed_time) / MAX(usecounts) AS AVG_ELAPSED
,MAX(usecounts) AS [execution_count]
,MAX(last_execution_time) AS 'last_execution_time'
FROM sys.dm_exec_query_stats qs
join sys.dm_exec_cached_plans cp on qs.plan_handle = cp.plan_handle
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle)
WHERE objtype = 'Proc' and dbid=DB_ID()
AND text NOT LIKE '%CREATE FUNC%'
GROUP BY cp.plan_handle,[DBID],objectid,cp.cacheobjtype,cp.objtype
ORDER BY AVG_CPU DESCRegards,
Danda