SQLSERVER:PREEMPTIVE_OS_GETPROCADDRESS等待類型的困惑
翻譯自:http://troubleshootingsql.com/2011/07/20/preemptive_os_getprocaddress-are-you-confusing-me/
PREEMPTIVE_OS_GETPROCADDRESS等待類型在SQLSERVER2008里是一個新的等待類型
這個等待類型的作用是當GetProcAddress跟蹤SQLSERVER實例調用擴展存儲過程的時候加載DLL的入口點所花費的時間
然而,這個等待類型跟蹤這個等待時間的方式有一些問題,這個問題在Rob Dorr的博客里有所記載
根據Twitter上面一個帖子的討論,我發現了可以證明這個問題的一個例子
我使用下面的命令去列出我的C盤下面的子目錄:
1 exec master..xp_dirtree 'C:\'
然后,我使用下面的TSQL腳本去監視系統中執行這個擴展存儲過程的那個會話的等待信息,這個TSQL腳本每隔一秒執行一次
1 SET NOCOUNT ON 2 WHILE (1=1) 3 BEGIN 4 SELECT [session_id], [status], [command], [start_time], [cpu_time], [reads], [writes], [wait_resource], [wait_time], [last_wait_type], [wait_type] 5 FROM sys.dm_exec_requests 6 WHERE [session_id] = 53 -- Session ID that is executing the Extended Stored Procedure 7 8 WAITFOR DELAY '00:00:01' 9 RAISERROR ('', 10, 1, N'Waits'); 10 11 END
按CTRL+T然后執行上面的SQL腳本,把結果粘貼出來
正如你在上面看到的,等待時間不斷遞增
我們能夠看到會話為了輸出下面的結果正在努力工作:
1、在SSMS里,執行這個擴展存儲過程的那個會話的結果窗口輸出執行結果
2、使用procmon這個工具跟蹤SQLSERVER進程對于C盤的文件系統的活動
您能夠使用SQLSERVER2008或者SQLSERVER2008R2,執行任何擴展存儲過程來重現這個問題
當我知道會話正在工作的時候,有兩樣東西我會檢查一下是否存在資源瓶頸:1、內存 2、I/O
如果一些文件系統的活動跟一些正在工作的擴展存儲過程有關。我見過的大部分問題都是因為這個等待類型引起的
#sqlhelp,Extended Stored Procedures,PREEMPTIVE_OS_GETPROCADDRESS
如有不對的地方,歡迎大家拍磚o(∩_∩)o
文章列表