it-swarm.dev

Znajdź zapytania powodujące oczekiwanie

Biorąc pod uwagę pewien rodzaj oczekiwania, w jaki sposób można znaleźć, które zapytania powodują ich bezpieczne czekanie na produkcyjnym serwerze SQL 2008 R2?

W tym konkretnym przypadku zastanawiam się nad async_network_io.

34
Kyle Brandt

Moim ulubionym sposobem sprawdzenia tego jest użycie doskonałego przechowywanego proc sp_WhoIsActive Adama Machanica. Oto wideo, jak go używać i link do pobrania kodu:

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

Problem polega na tym, że należy go uruchamiać okresowo, aby sprawdzić wyniki. Jeśli chcesz okresowo gromadzić te dane, zapoznaj się z samouczkiem Kendry Little dotyczącym przechwytywania wyników sp_WhoIsActive do tabeli:

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

Wreszcie, jeśli chcesz, aby coś się uruchomiło za każdym razem, gdy zapytanie czeka na async_network_io, możesz użyć nowego narzędzia o nazwie Extended Events. To jak punkty debugowania w silniku SQL Server, w których można sprawić, by magia się wydarzyła. Szczerze mówiąc, używanie go w 2008 roku jest trochę bolesne.

32
Brent Ozar

„async_wait_io” nie jest typem oczekiwania. Możliwe typy oczekiwania ASYNC% to:

  • ASYNC_IO_COMPLETION
  • ASYNC_NETWORK_IO
  • ASYNC_DISKPOOL_LOCK

Kilka dobrych linków do typów oczekiwania:

Moje przejście do zapytania o znalezienie bieżących oczekiwań:

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