AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 114455
Accepted
TheGameiswar
TheGameiswar
Asked: 2015-09-09 04:03:08 +0800 CST2015-09-09 04:03:08 +0800 CST 2015-09-09 04:03:08 +0800 CST

SQL Server 线程状态

  • 772

我们的 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
    

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

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

在此处输入图像描述

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

select status from sys.dm_Exec_requests

如果状态为待处理,我可以假设 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
            )
    
sql-server
  • 2 2 个回答
  • 17212 Views

2 个回答

  • Voted
  1. Best Answer
    Shanky
    2015-09-09T04:50:27+08:002015-09-09T04:50:27+08:00
    1. 如何知道线程是否可用于新请求或当前正忙于其他请求。

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

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

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

    select work_queue_count from sys.dm_os_scheduler where status='Visible online'
    
    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 
      
    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'
      
    • 2
  2. TheGameiswar
    2015-09-13T02:50:02+08:002015-09-13T02:50:02+08:00

    我做了一些测试,发现对我的问题的澄清很少。在此处添加它们。

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

    SQL server 将根据这个公式分配线程,同样可以在 sys.dm_os_sys_info 中找到,SQL 默认情况下从初始线程开始,并将根据负载不断增加线程到最大线程限制。要注意的是 SQL 不会杀死线程一旦创建,因为再次创建它们的成本很高。

    在我的情况下,我们曾经收到警告说只有 1o 个线程可用,但我无法弄清楚是否有任何线程可用于服务请求。

    使用基于此博客的 Ostress 工具进行的小测试也是如此,发现可以使用以下查询在任何时间点找到可用线程

    select (select max_workers_count from sys.dm_os_sys_info) as 'TotalThreads',sum(active_Workers_count) as 'Currentthreads',(select max_workers_count from sys.dm_os_sys_info)-sum(active_Workers_count) as 'Availablethreads',sum(runnable_tasks_count) as 'WorkersWaitingfor_cpu',sum(work_queue_count) as 'Request_Waiting_for_threads' 
    from  sys.dm_os_Schedulers where status='VISIBLE ONLINE'
    

    2.我正在尝试将 sys.dm_exec_requests 中的 task_address 与 sys.dm_os_tasks 和工作地址链接,如下所示

    抱歉,如果我的问题不清楚,但我想检查查询是否并行运行。

    任何并行查询都会在 sys.dm_os_tasks 加上 sys.sysprocesses 中有一个条目,因此要运行哪些查询并行运行,我们可以使用下面的 dmv。

    select
     er.session_id,
     er.status,
     er.command,
     er.blocking_session_id,
     er.wait_type,
     ot.exec_context_id,
     ot.task_state,
     st.text
    from
     sys.dm_exec_requests er
     join sys.dm_os_tasks ot on (er.session_id = ot.session_id)
     cross apply sys.dm_exec_sql_text(er.sql_handle) st
    where er.session_id in
     (select session_id
     from sys.dm_os_tasks
    group by session_id
    having count(exec_context_id)>1)
    

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

    由于多种原因,线程可能会被挂起,我检查了等待类型并且所有 spid 都在等待 CXpacket

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

    要知道您是否遭受工作线程饥饿,请使用以下查询。

    select sum(work_queue_count) from sys.dm_os_schedulers
    select * from sys.dm_os_tasks
    
    select * from sys.dm_os_waiting_tasks where wait_type='threadpool'
    

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

    根据我的理解,SQL 在使用并行性时会产生许多线程(如果它们可用),并且 SQL 跨度的线程数不限于 CPU 内核数,这就是我的情况,所以我们将尝试检查为什么这个查询成本是被 SQL 视为高,并将对此进行测试。

    感谢在线资源,我有一个误解,即当一个线程被异步 i/O 阻塞时,我认为 SQL 会尝试将这项工作卸载到 OS 线程,但事实并非如此

    在此处输入图像描述

    • 1

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve