web-dev-qa-db-fra.com

Rechercher des requêtes qui provoquent des attentes

Étant donné un certain type d'attente, comment trouvez-vous les requêtes qui provoquent ces attentes en toute sécurité sur un serveur de production SQL 2008 R2?

Dans ce cas particulier, je me pose des questions sur async_network_io.

34
Kyle Brandt

Ma façon préférée de les vérifier est d'utiliser l'excellent proc stocké sp_WhoIsActive d'Adam Machanic. Voici une vidéo sur la façon de l'utiliser et un lien pour télécharger le code:

http://www.brentozar.com/archive/2010/09/sql-server-dba-scripts-how-to-find-slow-sql-server-queries/

Le hic, c'est que vous devez l'exécuter périodiquement pour vérifier les résultats. Si vous souhaitez que ces données soient collectées périodiquement pour vous, consultez le tutoriel de Kendra Little sur la capture des résultats de sp_WhoIsActive dans une table:

http://www.littlekendra.com/2011/02/01/whoisactive/

Enfin, si vous voulez que quelque chose se déclenche chaque fois qu'une requête attend async_network_io, vous pouvez utiliser un nouvel outil appelé Événements étendus. C'est comme des points de débogage à l'intérieur du moteur SQL Server où vous pouvez faire bouger la magie. Franchement, c'est un peu pénible à utiliser en ce moment en 2008.

32
Brent Ozar

'async_wait_io' n'est pas un type d'attente. Les types d'attente ASYNC% possibles sont:

  • ASYNC_IO_COMPLETION
  • ASYNC_NETWORK_IO
  • ASYNC_DISKPOOL_LOCK

Quelques bons liens pour les types d'attente:

Ma recherche pour trouver les attentes actuelles:

SELECT  req.session_id
       ,blocking_session_id
       ,ses.Host_name
       ,DB_NAME(req.database_id) AS DB_NAME
       ,ses.login_name
       ,req.status
       ,req.command
       ,req.start_time
       ,req.cpu_time
       ,req.total_elapsed_time / 1000.0 AS total_elapsed_time
       ,req.command
       ,req.wait_type
       ,sqltext.text
FROM    sys.dm_exec_requests req
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS sqltext
JOIN    sys.dm_exec_sessions ses
        ON ses.session_id = req.session_id
WHERE req.wait_type IS NOT NULL
--WHERE req.wait_type = '?'