好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SQLSERVER:PREEMPTIVE

SQLSERVER:PREEMPTIVE_OS_GETPROCADDRESS等待类型的困惑 翻译自: http://troubleshootingsql.com/2011/07/20/preemptive_os_getprocaddress-are-you-confusing-me/ PREEMPTIVE_OS_GETPROCADDRESS 等待类型在SQLSERVER2008里是一个新的等待类型 这个等待类

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

查看更多关于SQLSERVER:PREEMPTIVE的详细内容...

  阅读:41次