2009-02-27 51 views
57

Estamos empezando a obtener una gran cantidad de procedimientos almacenados en nuestra aplicación. Muchos de ellos son para informes personalizados, muchos de los cuales ya no se utilizan. ¿Alguien sabe de una consulta que podríamos ejecutar en las vistas del sistema en SQL Server 2005 que nos diga la última fecha en que se ejecutó un procedimiento almacenado?Fecha de última ejecución en un procedimiento almacenado en SQL Server

+2

Esta es una gran pregunta. – NotMe

+2

Tenemos todos nuestros registros de Sprocs que fueron llamados. Todos nuestros Sprocs tienen un parámetro para la ID de sesión, y eso está incluido en el registro (junto con cualquier error planteado y duración). Nos hemos sentido cómodos (¡hasta ahora!) Con los gastos generales, y ha ayudado con los informes de depuración/administración a menudo – Kristen

Respuesta

26

En pocas palabras, no.

Sin embargo, hay cosas "agradables" que puede hacer.

  1. Ejecutar una traza con, por ejemplo, el nombre de procedimiento almacenado
  2. añadir una línea cada proc (crear un tabel por supuesto)
    • "INSERT dbo.SPCall (What, When) VALUES (OBJECT_NAME(@@PROCID), GETDATE()"
  3. Extend 2 con duración también

Hay cosas "divertidas" que puede hacer:

  1. eliminarlo, ver quién llama
  2. eliminar los derechos, a ver quién llama
  3. Añadir RAISERROR ('Warning: pwn3d: call admin', 16, 1), ver quién llama
  4. Añadir WAITFOR DELAY '00:01:00', ver quién llama

Usted consigue la idea. El probado método de "ver quién llama" de TI.

Si los informes son Reporting Services, puede mine the RS database ejecutar el informe si puede hacer coincidir el código para informar DataSet.

No puede confiar en los DMV de todos modos porque se reinician desde el reinicio del SQL Server. Los bloqueos/bloqueos de consulta son transitorios y no persisten durante un período de tiempo prolongado.

40

El siguiente código debe hacer el truco (> = 2008)

SELECT o.name, 
     ps.last_execution_time 
FROM sys.dm_exec_procedure_stats ps 
INNER JOIN 
     sys.objects o 
     ON ps.object_id = o.object_id 
WHERE DB_NAME(ps.database_id) = '' 
ORDER BY 
     ps.last_execution_time DESC 

Edición 1: Por favor, tome nota de consejos Jeff Modens a continuación.

+0

funciona solo en SQL 2008 y más – Kodak

+0

+1 un guión muy útil, gracias, una pequeña corrección, en la segunda línea que faltó una 'e', ​​debería ser 'a.last_execution_time', – AmmarR

+1

Gracias y +1 por esto. DMV muy útil. ¿podemos obtener los parámetros de entrada provistos del procedimiento también de todos modos? –

21

¡Oh, ten cuidado ahora! ¡Todo lo que brilla no es oro! Todas las vistas y funciones de dm "stats" tienen un problema para este tipo de cosas. Solo funcionan contra lo que está en caché y la vida útil de lo que está en caché se puede medir en minutos. Si tuviera que usar tal cosa para determinar qué SP son candidatos para ser descartados, podría estar en un mundo de dolor cuando elimine los SP que se utilizaron hace unos minutos.

Los siguientes extractos son de los libros en línea de las opiniones dadas dm ...

sys.dm_exec_procedure_stats devuelve las estadísticas de rendimiento agregados para procedimientos almacenados en caché. La vista contiene una fila por procedimiento almacenado, y la duración de la fila es tan larga como el procedimiento almacenado permanece en la memoria caché. Cuando se elimina un procedimiento almacenado de la memoria caché, la fila correspondiente se elimina de esta vista.

sys.dm_exec_query_stats La vista contiene una fila por instrucción de consulta dentro del plan en caché, y la duración de las filas está vinculada al plan en sí. Cuando se elimina un plan de la memoria caché, las filas correspondientes se eliminan de esta vista.

+1

Entonces, ¿sería justo decir que si hay una entrada presente en la consulta ofrecida por @Pixelated, entonces el último tiempo de ejecución es correcto, pero si falta una entrada, entonces no puede hacer suposiciones sobre su último tiempo de ejecución? –

+3

Mis disculpas por la respuesta extremadamente tardía. No he estado aquí mucho últimamente. Lo que declaraste arriba es correcto. –

1

Esto funciona bien en 2005 (si el plan está en la caché)

USE YourDb; 

SELECT qt.[text]   AS [SP Name], 
     qs.last_execution_time, 
     qs.execution_count AS [Execution Count] 
FROM sys.dm_exec_query_stats AS qs 
     CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt 
WHERE qt.dbid = DB_ID() 
     AND objectid = OBJECT_ID('YourProc') 
0

Yo uso este:

use YourDB; 

SELECT 
    object_name(object_id), 
    last_execution_time, 
    last_elapsed_time, 
    execution_count 
FROM 
    sys.dm_exec_procedure_stats ps 
where 
     lower(object_name(object_id)) like 'Appl-Name%' 
order by 1 
+2

formato correctamente – HaveNoDisplayName

5

sys.dm_exec_procedure_stats contiene la información sobre las funciones de ejecución, las limitaciones y Procedimientos, etc. Pero el tiempo de vida de la fila tiene un límite. En el momento en que se elimina el plan de ejecución de la memoria caché, la entrada desaparecerá.

Use [yourDatabaseName] 
GO 
SELECT 
     SCHEMA_NAME(sysobject.schema_id), 
     OBJECT_NAME(stats.object_id), 
     stats.last_execution_time 
    FROM 
     sys.dm_exec_procedure_stats stats 
     INNER JOIN sys.objects sysobject ON sysobject.object_id = stats.object_id 
    WHERE 
     sysobject.type = 'P' 
    ORDER BY 
      stats.last_execution_time DESC 

Esto le dará la lista de los procedimientos ejecutados recientemente.

Si desea comprobar si un procedimiento almacenado perticular ejecutado recientemente

SELECT 
    SCHEMA_NAME(sysobject.schema_id), 
    OBJECT_NAME(stats.object_id), 
    stats.last_execution_time 
FROM 
    sys.dm_exec_procedure_stats stats 
    INNER JOIN sys.objects sysobject ON sysobject.object_id = stats.object_id 
WHERE 
    sysobject.type = 'P' 
    and (sysobject.object_id = object_id('schemaname.procedurename') 
    OR sysobject.name = 'procedurename') 
ORDER BY 
     stats.last_execution_time DESC 
Cuestiones relacionadas