20

使用されたことがない、または何ヶ月も使用されていないデータベース内のすべてのストアドプロシージャを追跡しようとしています。

使用されていないすべてのストアドプロシージャを表示するクエリを見つけて、それらのストアドプロシージャを分析して、削除できるかどうかを判断できるようにしたいと思います。

私はsys.proceduresに精通していますが、プロシージャが使用されているかどうかを判断する方法がわかりません。

SELECT *
FROM sys.procedures;

SQL Server2008R2の使用。

UPDATE UPDATE UPDATE

以下のAaronBertrandからのクエリを使用して、少し変更しました。これは私が最終的に使用したものであり、完璧でした。

SELECT p.*
  FROM sys.procedures AS p
  LEFT JOIN sys.dm_exec_procedure_stats AS s ON s.[object_id] = p.[object_id]
 WHERE s.object_id IS NULL;

hlepをありがとう。

4

3 に答える 3

30

DMVはプロシージャの統計を記録しますが、最後の再起動までさかのぼる可能性があります(プランがキャッシュに存在する期間によっては、それほど遠くない場合もあります)。

SELECT * FROM sys.dm_exec_procedure_stats AS s
INNER JOIN sys.procedures AS p
ON s.[object_id] = p.[object_id]
ORDER BY p.name;

したがって、システムが短時間しか稼働していない場合、これは信頼できる手段ではありません。@Sivaが指摘するリンクは、他のアイデアにも役立ちます。残念ながら、SQL Serverは実際にはこれを全体的に追跡しないため、トレースまたはロギングを追加しない限り、DMVに置く信頼に固執します...

編集それは良い点でした、私は実行された手順を解決してました。代わりに、これが必要になる場合があります。

SELECT sc.name, p.name 
FROM sys.procedures AS p
INNER JOIN sys.schemas AS sc
  ON p.[schema_id] = sc.[schema_id]
LEFT OUTER JOIN sys.dm_exec_procedure_stats AS st
  ON p.[object_id] = st.[object_id]
WHERE st.[object_id] IS NULL
ORDER BY p.name;

または、実行されたプロシージャも含めて、最後に実行された日時順に並べ替えることができます。

SELECT sc.name, p.name 
FROM sys.procedures AS p
INNER JOIN sys.schemas AS sc
  ON p.[schema_id] = sc.[schema_id]
LEFT OUTER JOIN sys.dm_exec_procedure_stats AS st
ON p.[object_id] = st.[object_id]
ORDER BY st.last_execution_time, p.name;

これにより、最初に再起動以降に実行されていないプロシージャが順序付けられ、次に最後に実行されたときまでに残りが最も古いものから順に並べられます。

于 2012-05-02T20:51:36.713 に答える
3

これが私にとって最も有用だった受け入れられた答えのバリエーションです:

SELECT sc.NAME + '.' + p.NAME [Procedure]
    ,s.last_execution_time
FROM sys.procedures AS p
LEFT JOIN sys.dm_exec_procedure_stats AS s ON p.[object_id] = s.[object_id]
INNER JOIN sys.schemas sc ON p.schema_id = sc.schema_id
ORDER BY s.last_execution_time
    ,sc.NAME
    ,p.NAME

変更により、最後の実行時間が表示され、プロシージャのスキーマが含まれます。

于 2013-07-15T15:32:31.110 に答える
1

何らかの理由で、私のdm_exec_procedure_statsビューは1日を通して自動的にクリアされます。だから私は今それを実行しました、そして最も早い実行時間は今朝からです、しかし私たちは今朝か何かでSQLを再起動しなかったことを知っています。

とにかく、1時間ごとに実行するジョブに入れて、最近実行されたprocをキャプチャできるprocを作成したかったのです。これが私がしたことです:

実行されるprocとその最初と最後の実行時間をログに記録するテーブルを作成しました。

create table ProcsThatExecute (procName varchar(500), firstExecutionTime datetime, lastExecutionTime datetime)

ProcsThatExecuteテーブルを挿入または更新するプロシージャを作成しました。これを1時間ごとにジョブで実行すると、数日、数週間、または数か月後に、どのprocが使用されたかのログが得られます。

alter procedure LogProcsThatExecute as begin

    --If they don't already exist in this table, add them.
    insert into ProcsThatExecute(procName, firstExecutionTime, lastExecutionTime)
    SELECT p.NAME ProcName, s.last_execution_time, null
    FROM sys.procedures AS p
        LEFT OUTER JOIN sys.dm_exec_procedure_stats AS s ON p.[object_id] = s.[object_id]
    where not exists (
        select 1 from ProcsThatExecute pte where pte.procName = p.name
    ) and last_execution_time is not null


    --If they do exist in this table, update the last execution time.
    update ProcsThatExecute set lastExecutionTime = s.last_execution_time
    from ProcsThatExecute pte
    inner join sys.procedures AS p on pte.procName = p.name
        LEFT OUTER JOIN sys.dm_exec_procedure_stats AS s ON p.[object_id] = s.[object_id]
    where s.last_execution_time is not null

end
于 2014-01-10T01:21:53.140 に答える