3
votes

Compteur d'exécution du temps de procédure

J'ai une procédure qui insère des données d'une table à une autre et une fois cela prend de l'exemple 5 minutes et la fois suivante par exemple 15 minutes. Je veux écrire du code qui crée un journal dans ma table de journal lorsque la procédure prendra plus de 10 minutes. Existe-t-il une fonction ou un compteur de temps en ms sql que je peux utiliser?


1 commentaires

Enregistrez l'heure actuelle au début du SP et vérifiez à la fin du SP si la différence par rapport à l'heure actuelle est supérieure au montant que vous souhaitez vérifier, et enregistrez-la si c'est le cas. Peut faire à l'intérieur ou à l'extérieur de SP, comme vous le souhaitez.


3 Réponses :


1
votes

Vous pouvez essayer de cette façon

declare @start datetime = getdate()

-- your SQL statements
exec dbo.MyStoredProcedure

declare @executionTimeInMilliseconds int = datediff(ms, @start, getdate())


0 commentaires

4
votes

Ajoutez les lignes suivantes dans votre SP et cela devrait fonctionner:

ALTER PROCEDURE YourSP
    AS
BEGIN
DECLARE @StartTime AS DATETIME = GETDATE();
... <Your current lines>
IF DATEDIFF(mi, @StartTime, GETDATE()) > 10
    INSERT INTO LogTable <YourFields>, MinutesSpent 
    VALUES <YourValues>, DATEDIFF(mi, @StartTime, GETDATE())
END


0 commentaires

2
votes

C'est trop long pour un commentaire.

Pourquoi ne consigneriez-vous que certains appels à la procédure stockée? Vous devez enregistrer tous les appels et filtrer ceux que vous souhaitez. Cette semaine, vous pourriez être intéressant pour des horaires de plus de 10 minutes. La semaine prochaine, les données pourraient augmenter et cela pourrait prendre 12 minutes. Ou vous pouvez changer le code pour le rendre plus efficace, et il devrait se terminer en 2 minutes.

Si vous n'êtes intéressé que par le timing, j'écrirais une table de log plutôt générique, quelque chose comme ceci: p>

select count(*)
from spTimeLog tl
where tl.procedureName = 'usp_proc' and
      endDateTime > dateadd(minute, 10, startDateTime);

Ensuite, vous pouvez obtenir les informations que vous souhaitez lorsque vous interrogez la table:

create table spTimeLog (
    procedureName varchar(255),
    startDateTime datetime
    endDateTime datetime,
    createdAt datetime default getdate()
);

create procedure usp_proc . . .
begin
    declare @StartTime datetime = getdate();
    . . .

    insert into spTimeLog (procedureName, startDateTime, endDateTime)
        values ('usp_proc', StartTime, getdate());
end;

En général, lorsque j'écris des procédures stockées pour une application réelle, les procédures stockées génèrent des journaux d'audit lorsqu'elles entrent et sortent - à la fois avec succès et en cas d'échec.


0 commentaires