it-swarm.it

Trova query che causano attese

Dato un certo tipo di attesa, come si trovano quali query stanno causando quelle attese in modo sicuro su un server SQL 2008 R2 di produzione?

In questo caso particolare mi chiedo async_network_io.

34
Kyle Brandt

Il mio modo preferito di controllare questi è usare l'eccellente proc sp_WhoIsActive di Adam Machanic. Ecco un video su come usarlo e un link per scaricare il codice:

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

Il problema è che devi eseguirlo periodicamente per verificare i risultati. Se vuoi che questi dati vengano raccolti periodicamente per te, dai un'occhiata al tutorial di Kendra Little sull'acquisizione dei risultati sp_WhoIsActive in una tabella:

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

Infine, se vuoi che qualcosa si attivi quando una query attende async_network_io, puoi utilizzare un nuovo strumento chiamato Extended Events. È come i punti di debug all'interno del motore di SQL Server in cui è possibile realizzare la magia. Francamente, è un po 'doloroso da usare in questo momento nel 2008.

32
Brent Ozar

'async_wait_io' non è un tipo di attesa. I possibili tipi di attesa% ASYNC sono:

  • ASYNC_IO_COMPLETION
  • ASYNC_NETWORK_IO
  • ASYNC_DISKPOOL_LOCK

Alcuni buoni collegamenti per i tipi di attesa:

Il mio andare alla query per trovare le attese attuali:

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 = '?'