SQL Server 线程状态

The*_*war 6 sql-server

我们的 SQL 配置为最多使用 704 个线程,有时我们会收到警告,指出只剩下 10 个线程,所以我无法理解 SQL 是否保持线程打开,因为再次创建新线程的成本很高。

所以我的问题是

  1. 如何知道线程是否可用于新请求或当前正忙于其他请求。

  2. 我正在尝试task_address从 sys.dm_exec_requests 与 sys.dm_os_tasks链接,worker_address如下所示

    select * from sys.dm_exec_requests ec
    join
    sys.dm_os_tasks tsk
    on tsk.task_state=ec.task_address
    join
    sys.dm_os_workers wrk
    on wrk.worker_address=tsk.worker_address
    
    Run Code Online (Sandbox Code Playgroud)

我没有看到任何输出,这是否意味着我可以假设所有线程都是空闲的

  1. 目前下面是我的工作线程的状态,这个挂起是什么意思?我可以看到计数超过 500 的挂起状态。我没有看到任何阻塞

在此处输入图片说明

4.我可以使用下面的查询来发现我有工作线程饥饿吗

select status from sys.dm_Exec_requests
Run Code Online (Sandbox Code Playgroud)

如果状态为挂起,我可以假设 SQL 正在等待新的工作线程

  1. 目前我看到一个会话,在 sysprocesses 中有超过 250 行,当我查询时sys.dm_os_Waiting_tasks,我可以看到超过 2186 行,其中 90% 是针对同一个会话。所以我的问题是查询如何跨越这么多线程

在此处输入图片说明

  1. 我会使用下面的查询获得可用的工人数量,这是正确的吗?

    select (
            select max_workers_count
            from sys.dm_os_sys_info
            ) - (
            select sum(active_workers_count)
            from sys.dm_os_Schedulers
            )
    
    Run Code Online (Sandbox Code Playgroud)

Sha*_*nky 2

  1. 如何知道线程是否可用于新请求或当前正忙于其他请求。

您可以使用 DMV sys.dm_os_schedulers来获取此信息。您必须参考的专栏是work_queue_count。根据 BOL,这意味着

待处理队列中的任务数。这些任务正在等待工人来接走。不可为空。

您可以使用以下查询来检查所有在线调度程序的等待任务数

select work_queue_count from sys.dm_os_scheduler where status='Visible online'
Run Code Online (Sandbox Code Playgroud)
  1. 我不确定你想要实现什么,但以下是我从这个博客中得到的内容

      select wt.session_id, 
      ot.task_state, 
      wt.wait_type, 
      wt.wait_duration_ms, 
      wt.blocking_session_id, 
      wt.resource_description, 
      es.[host_name], 
      es.[program_name] 
      FROM  sys.dm_os_waiting_tasks  wt  
      INNER  JOIN sys.dm_os_tasks ot 
      ON ot.task_address = wt.waiting_task_address 
      INNER JOIN sys.dm_exec_sessions es 
      ON es.session_id = wt.session_id 
      WHERE es.is_user_process =  1 
    
    Run Code Online (Sandbox Code Playgroud)
  1. 我可以看到处于暂停状态的计数超过 500。我没有看到任何阻塞

挂起的线程正在等待某些资源并且当前不活动。等待可以是 I/O、网络等。有关更多详细信息,请参阅我分享的博客。

  1. 我可以使用下面的查询来发现我有工作线程饥饿吗

不,这不是正确的查询。

  1. 停止使用 sys.sysprocesses 是旧视图,MS 不建议使用它。而是使用sys.dm_exec_requests

  2. 您可以使用 DMV sys.dm_os_scheduler 获取每个调度程序的工作线程数

       select current_workers_count from sys.dm_os_scheduler where status='visible online'
    
    Run Code Online (Sandbox Code Playgroud)