Suivi de l'utilisation des procédures stockées

19

Outre l'utilisation de SQL Server Profiler, existe-t-il un moyen de suivre les procédures stockées qui sont utilisées, ou du moins quand elles ont été exécutées pour la dernière fois?

DForck42
la source
4
Vous pouvez toujours consulter le cache du plan. SQL Server ne suit pas ces informations indéfiniment car les métadonnées deviennent rapidement volumineuses et coûteuses.
JNK

Réponses:

17

Vous pouvez regarder dans le cache du plan pour avoir une assez bonne idée de l'utilisation de la procédure stockée. Prenez cette requête, par exemple:

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

Cela vous donnera les usecountsprocédures stockées qui sont mises en cache SomeDB.

Remarque: le cache de plan contient les plans d'exécution. Cette conservation de ces plans implique de nombreux facteurs. Alors que cela vous donnera une bonne idée de ce qui est utilisé et de la fréquence, ce n'est certainement pas le total en cours d'exécution des procédures stockées et à quelle fréquence / quand elles ont été exécutées.

Référence BOL sur le cache de plan

Thomas Stringer
la source
4
Rappelez-vous que cela ne vous indique que le sp a été exécuté assez récemment et ne vous donne aucune information sur les procs qui ne sont pas ici. Des choses comme les procs derrière les rapports trimestriels sont exécutées peu fréquemment mais sont utilisées. Donc, fondamentalement, cela vous donne simplement une liste de recherches dans les applications qui frappent votre base de données.
HLGEM
1
@HLGEM Précisément. J'ai essayé de clarifier ce point dans ma réponse.
Thomas Stringer
Est-il possible de le faire pour une plage de datetime spécifique? (par exemple, dernier jour / mois, etc.)?
Jose Parra
Notez que cette requête ne renverra pas de ligne pour une procédure stockée qui a été modifiée et non exécutée par la suite.
Axel2D
10

Vous pouvez y jeter un œil, car il contient des informations last_execution_timesur chaque procédure stockée.

    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
la source
Il y a une mise en garde à ce tho. Ces statistiques ne sont conservées que depuis la dernière exécution de la base de données. Je suis en train d'écrire un travail qui l'archivera sur une table une fois par jour.
earthling42
@ earthling42, avez-vous déjà écrit un travail qui l'a archivé sur une table quotidiennement?
Alex Chung
@Alex Chung - malheureusement, nous n'y sommes jamais parvenus. Déplacé sur des projets non MS-SQL peu de temps après la date de ce post. Ça ne devrait pas être trop dur? Je serais heureux d'essayer de travailler avec vous si vous êtes intéressé.
earthling42