我们的SQL配置为使用704个线程的最大值,有时我们会收到警报,说明只剩下10个线程,因此我无法理解SQL是否使线程保持打开状态,因为再次创建一个新线程是很昂贵的。
task_address从sys.dm_exec_requests链接到sys.dm_os_tasks和worker_address,如下所示,select *来自sys.dm_exec_requests ec,加入sys.dm_os_tasks tsk on tsk.task_state=ec.task_address,连接sys.dm_os_workers wrk on wrk.worker_address=tsk.worker_address我没有看到任何输出,这是否意味着我可以假设所有线程都是空闲的

4.我是否可以使用下面的查询来发现我有工作线程饥饿
select status from sys.dm_Exec_requests如果状态挂起,我是否可以假定SQL正在等待新的辅助线程?
sys.dm_os_Waiting_tasks时,我可以看到超过2186行,其中90%用于相同的session.So --我在这里的问题是,一个查询如何跨越这些多个线程
发布于 2015-09-08 12:50:27
您可以使用DMV sys.dm_操作系统_调度器获取这些信息。您必须引用的列是work_queue_count。根据BOL的意思是
挂起队列中的任务数。这些任务正在等待一个工人来接他们。是不可空的。
您可以使用下面的查询来检查所有在线调度程序的等待次数。
select work_queue_count from sys.dm_os_scheduler where status='Visible online'挂起的线程正在等待某些资源,目前不活动。等待可以是I/O、网络等。关于更多细节,请看我分享的博客。
不,这不是正确的查询。
sys.dm_exec_requests发布于 2015-09-12 10:50:02
我做了一些测试,在这里几乎没有发现我的question.Adding说明。
server将根据此公式分配线程,在sys.dm_os_sys_info中也可以找到相同的线程,默认情况下,SQL以初始线程开始,并将根据load.Point将线程上限提高到最大值,请注意,一旦创建了SQL就不会杀死线程,因为再次创建它们是昂贵的。
在我的例子中,我们过去只收到通知,说明只有1o线程可用,但我无法确定是否有可用的线程来服务请求。
因此,使用基于此博客的O应激工具进行小测试,并发现可用线程可以在任何时候使用下面的查询找到。
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.我正在尝试将task_address与sys.dm_exec_requests的sys.dm_os_tasks和worker adress联系起来,如下所示
如果我的问题不清楚,很抱歉,但我想检查查询是否并行运行。
任何并行查询都将在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多个挂起的线程,我没有看到任何阻塞
由于许多原因,线程可以挂起,我选择了等待类型,所有的线程都在等待CXpacket。
若要了解是否正遭受工作线程饥饿的困扰,请使用以下查询。
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'根据我的理解,SQL在使用并行性时会产生许多线程,如果它们是可用的,并且线程的数量不限于CPU内核的数目,这就是在我的例子中发生的情况,所以我们将尝试检查为什么SQL认为这个查询成本很高,并将对其进行测试。
感谢网上的资源,我有一个误解,当一个线程被异步i/O阻塞时,我认为SQL会尝试将这项工作卸载到OS线程,但事实并非如此。

https://dba.stackexchange.com/questions/114455
复制相似问题