Verfolgen der Verwendung gespeicherter Prozeduren

19

Gibt es neben der Verwendung von SQL Server Profiler eine Möglichkeit, zu verfolgen, welche gespeicherten Prozeduren verwendet werden oder zumindest, wann sie zuletzt ausgeführt wurden?

DForck42
quelle
4
Sie können sich jederzeit den Plan-Cache ansehen. SQL Server verfolgt dieses Zeug nicht für immer, da Metadaten schnell umfangreich und teuer werden.
JNK

Antworten:

17

Sie können im Plan-Cache nachsehen, um eine gute Vorstellung von der Verwendung gespeicherter Prozeduren zu erhalten. Nehmen Sie diese Abfrage zum Beispiel:

select
    db_name(st.dbid) as database_name,
    object_name(st.objectid) as name,
    p.size_in_bytes / 1024 as size_in_kb,
    p.usecounts,
    st.text
from sys.dm_exec_cached_plans p
cross apply sys.dm_exec_sql_text(p.plan_handle) st
where p.objtype = 'proc'
and st.dbid = db_id('SomeDatabase')
order by p.usecounts desc

Dadurch erhalten Sie die usecountsgespeicherten Prozeduren, die im Cache gespeichert sind SomeDB.

Hinweis: Der Plan-Cache enthält die Ausführungspläne. Diese Beibehaltung dieser Pläne hat viele Faktoren zur Folge. Auf diese Weise erhalten Sie eine gute Vorstellung davon, was und wie oft verwendet wird. Es handelt sich jedoch definitiv nicht um die laufende Summe der gespeicherten Prozeduren und wie oft / wann sie ausgeführt wurden.

BOL-Referenz zum Plan-Cache

Thomas Stringer
quelle
4
Denken Sie daran, dies sagt Ihnen nur, dass der SP vor relativ kurzer Zeit ausgeführt wurde, und gibt Ihnen keine Informationen zu Prozessen, die hier nicht enthalten sind. Dinge wie Prozesse hinter Quartalsberichten werden selten ausgeführt, aber verwendet. Das gibt Ihnen also nur eine Liste, in der Sie nach den Anwendungen suchen können, die auf Ihre Datenbank zutreffen.
HLGEM
1
@HLGEM Genau. Ich habe versucht, dies in meiner Antwort deutlich zu machen.
Thomas Stringer
Ist dies für einen bestimmten Zeitraum möglich? (zB letzter Tag / letzter Monat usw.)?
Jose Parra
Beachten Sie, dass diese Abfrage keine Zeile für eine gespeicherte Prozedur zurückgibt, die geändert und anschließend nicht ausgeführt wurde.
Axel2D
10

Sie können sich dies ansehen, und es enthält Informationen last_execution_timezu jeder gespeicherten Prozedur.

    SELECT DB_NAME(database_id)
    ,OBJECT_NAME(object_id,database_id)
    ,cached_time
    ,last_execution_time
    ,execution_count
FROM sys.dm_exec_procedure_stats
Sai Chaitanya M
quelle
Es gibt eine Einschränkung zu diesem tho. Diese Statistiken werden erst seit der letzten Datenbankausführung gespeichert. Ich bin damit beschäftigt, einen Job zu schreiben, der ihn einmal am Tag in einer Tabelle archiviert.
earthling42
@ earthling42, hast du jemals einen Job geschrieben, der ihn täglich auf einem Tisch archiviert hat?
Alex Chung
@ Alex Chung - leider nie dazu gekommen. Wurde kurz nach dem Datum dieses Beitrags in Nicht-MS-SQL-Projekte verschoben. Sollte nicht zu schwer sein? Ich würde gerne versuchen, es mit Ihnen auszuarbeiten, wenn Sie interessiert sind.
earthling42