sys.dm_exec_procedure_stats 缺少历史记录?

Wom*_*nea 5 sql-server stored-procedures sql-server-2008-r2 dmv

我的老板想让我找出我们的网站不再使用哪些(大约 400 多个)存储过程。我找到并重新编写了一个脚本,为我提供了最近执行的详细信息,但它只能追溯到 9 月 1 日上午 10:17。

我的老板向我保证(尽管他喜欢在业余时间摆弄服务器)服务器自 5 月 5 日起就开始运行。

我对此很陌生,所以像我是一只特别简单的家养宠物一样解释它,但是有没有理由为什么我的结果表只回溯 1 个月,而不是完整的 6 个月?如果服务器重新启动,我会假设正常运行时间会重置,但我不确定为什么我不会有那么远的任何历史记录。

使用right-click -> modify计数作为执行查看过程吗?

SQL查询

SELECT qt.text AS 'SP Name',
qt.dbid as 'SP DB',
qs.execution_count AS 'Execution Count',
qs.total_worker_time/qs.execution_count AS 'AvgWorkerTime',
qs.total_worker_time AS 'TotalWorkerTime',
qs.total_physical_reads AS 'PhysicalReads',
qs.last_execution_time 'Last Executed'
FROM sys.dm_exec_procedure_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
where qs.database_id = 5
ORDER BY qs.last_execution_time asc
Run Code Online (Sandbox Code Playgroud)

我的问题更多地与结果的时间范围有关。我在获得结果的月份中找到了我需要的信息,但我担心有 6 个月的结果没有被找到。

这将返回 5 月 5 日:

select create_date from sys.databases where name = N'tempdb';
Run Code Online (Sandbox Code Playgroud)

以下返回“2015-05-05 08:27:42.080”:

SELECT sqlserver_start_time FROM sys.dm_os_sys_info;
Run Code Online (Sandbox Code Playgroud)

最后,这个返回“2013-09-15 19:34:34.667”:

SELECT top 1 [rs].[destination_database_name], [rs].[restore_date] 
FROM msdb..restorehistory rs 
where destination_database_name = '%ID%' 
ORDER BY [rs].[restore_date] DESC;
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 6

文档中sys.dm_exec_procedure_stats

返回缓存存储过程的聚合性能统计信息。视图为每个缓存的存储过程计划返回一行,并且该行的生命周期与存储过程保持缓存的时间一样长。当从缓存中删除存储过程时,相应的行将从该视图中删除。

因此,很可能在 9 月 1 日的某个时间,服务器发生了导致过程缓存被刷新的事件,或者至少导致您关心的过程的计划被推出缓存。我们已经排除了最明显的罪魁祸首——故障转移或服务重启——但它可能是任何事情,真的:

  • 一个单元测试,它执行了一大堆程序,填满了缓存
  • sp_configure变化,这-对于某些选项-具有清热过程缓存的副作用
  • 具有巨大内存授予的单个查询
  • 手册 DBCC FREEPROCCACHE;
  • 显式重新编译或删除/重新创建过程
  • ...