web-dev-qa-db-ja.com

sys.dm_exec_procedure_statsに履歴がありませんか?

上司は、私たちのWebサイトで使用されなくなった(約400以上の)ストアドプロシージャを見つけてほしいと考えています。最新の実行の詳細を示すスクリプトを見つけて作り直しましたが、9月1日の午前10時17分までしか遡ることができません。

上司は私に保証します(彼は暇なときにサーバーをいじくり回すのが好きですが)サーバーは5月5日から稼働しています。

私はこれがかなり新しいので、私が特にシンプルな家のペットであるように説明しますが、結果表が6か月分ではなく1か月しか戻らない理由はありますか?サーバーを再起動すると稼働時間はリセットされると思いますが、なぜそこまでさかのぼって履歴がないのかはわかりません。

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

私の質問は結果の時間枠にもっと関係しています。ある月の結果で必要な情報を見つけていますが、見つからない結果が6か月あるのではないかと心配しています。

5月5日を返します。

select create_date from sys.databases where name = N'tempdb';

以下は「2015-05-05 08:27:42.080」を返します。

SELECT sqlserver_start_time FROM sys.dm_os_sys_info;

最後に、これは「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;
5
Wompguinea

から sys.dm_exec_procedure_stats

キャッシュされたストアドプロシージャのパフォーマンス統計情報を返します。ビューは、キャッシュされたストアドプロシージャプランごとに1行を返します。行の有効期間は、ストアドプロシージャがキャッシュされている限りです。ストアドプロシージャがキャッシュから削除されると、対応する行がこのビューから削除されます。

したがって、9月1日のある時点で、サーバーにプロシージャキャッシュがフラッシュされるイベントが発生したか、少なくとも、必要なプロシージャのプランがキャッシュからプッシュされた可能性があります。フェイルオーバーやサービスの再起動など、最も明白な原因はすでに除外されていますが、実際には次のようなものでした。

  • 多数の手順を実行し、キャッシュをいっぱいにする単体テスト
  • sp_configure変更。これは、特定のオプションについて、プロシージャキャッシュをクリアするという副作用があります。
  • 巨大なメモリ許可を持つ単一のクエリ
  • マニュアルDBCC FREEPROCCACHE;
  • 明示的な再コンパイルまたはプロシージャの削除/再作成
  • ...
6
Aaron Bertrand