Notification sur une requête de longue durée ou un blocage dans SQL Server 2008 R2?


15

Je voudrais savoir s'il existe un moyen d'envoyer une notification en cas de blocage? Si oui, quelles requêtes seraient nécessaires. Je comprends que SQL Server s'occupe des blocages, je voudrais simplement des informations sur les requêtes impliquées.

J'ai trouvé ce qui suit pour déterminer les requêtes de longue durée:

SELECT 
    creation_time
    ,last_execution_time
    ,total_physical_reads
    ,total_logical_reads
    ,total_logical_writes
    , execution_count
    , total_worker_time
    , total_elapsed_time
    , total_elapsed_time / execution_count avg_elapsed_time
    ,SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
    ((CASE statement_end_offset
        WHEN -1 THEN DATALENGTH(st.text)
        ELSE qs.statement_end_offset END
    - qs.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS qs
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st  
where total_elapsed_time >= 300000000 --5 min
ORDER BY total_elapsed_time / execution_count DESC; 

Je voudrais savoir si ce qui précède est la bonne façon de procéder, ou existe-t-il une meilleure façon de déterminer si une requête prend plus de temps qu'un intervalle spécifique, par exemple 5 minutes, comme indiqué?

Merci

Réponses:


8

Avec SQL 2008, il existe une nouvelle fonctionnalité que vous pouvez utiliser pour les blocages et les requêtes longues: les événements étendus . Les événements étendus sont des objets de bas niveau et consomment beaucoup moins de ressources que d'autres méthodes comme le profilage / traçage, les alertes, etc.

Pour avoir utilisé des événements étendus, deadlocksconsultez cet article de Jonathan Kehayias , MVP SQL Server.

Pour utiliser des événements étendus pour trouver long running queries, consultez ce post détaillé de Pinal Dave , un autre MVP SQL Server.


10

Vous pouvez configurer des alertes pour les deux avec SQL Agent. Créez une nouvelle alerte et sélectionnez le type «Alerte de condition de performance SQL Server»

Pour les requêtes de longue durée, choisissez Objet "MSSQL $ InstanceName: Transactions" et Counter: Longest Transaction Running Time. Configurez les valeurs et les options de notification d'alerte, et vous êtes prêt à partir.

Pour les interblocages, l'objet est "MSSQL $ InstanceName: Locks" et le compteur est "Number of Deadlocks / sec"

Si vous souhaitez un contrôle plus fin de la notification de blocage, vérifiez ceci: http://www.sqlservercentral.com/articles/Administration/3243/


J'ai tenté de configurer l'alerte comme vous l'avez suggéré, mais le travail ne s'exécutera que si des étapes ont été définies. Existe-t-il un moyen de configurer l'alerte sans définir les étapes du travail?
Hasanain

4

Je favoriserais la suggestion de @StanleyJohns si vous avez SQL2008. Les événements prolongés valent la peine de vous familiariser avec en tant qu'outil de diagnostic et la série An XEvent a Day de Jonathon est un excellent point de départ.

Une alternative pour les blocages consiste à activer les indicateurs de trace 1204 et 1222 , qui transfèrent les informations de blocage dans le journal des erreurs SQL. Activez les deux pour obtenir les informations sous deux formats différents, ce qui peut faciliter la compréhension des chaînes de blocage complexes.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.