代码改变世界

3.4执 行 模 型

2018-06-27 15:36  笑一笑十年少!!!  阅读(199)  评论(0编辑  收藏  举报

这部分会在第7 章中详细介绍。当一个应用程序(包括SSMS)成功与SQL Server建立 联系之后,会有一个会话ID ( session_id)与这个连接相关联,可以通过查询sys.dm_exec_ sessions这个DMV来获取当前所有已授权的会话列表。当一个会话发出一个请求时,SQL Server会把这个请求拆分一个或多个任务(tasks),然后关联对应个数的工作者线程(worker thread),每个线程都会有如下3 个状态。

1) running。一个处理器在某个时刻只能做一件事情,当一个线程正在一个处理器上运行'时,这个线程的状态就为running。

2 ) suspended。如果在SQL Server的一个线程中进行协同操作的调度(Scheduler,后 面提到)需要运行起来,而此时SQL Server没有足够的资源,那么线程会放弃当前占有 的处理器,变成挂起(suspended)状态,等待这个协同操作运行结束。这种状态在SQL Server中也叫等待(wait)。

3) runnable。如果一个线程已经完成等待,但是还没有轮到它运行,就会变成runnable 状态,代表已经准备好被执行。这种叫信号等待(signal wait)。如果当前SQL Server已经没有可用的工作者线程,并且最大工作线程数还没达到,那 么会分配一个新的工作线程。如果最大线程已经达到,那么这个任务会变成等待状态,这 个等待类型叫作threadpool,直到有可用的线程为止。默认的最大线程数是基于CPU体系 和逻辑核心数的(这在第2 章已经介绍过)。下面是逻辑CPU格式在不同位数的操作系统中 能支持的最大工作者线程数。

还有一个比较简单的方法可用于检查当前系统的最大线程数。比如执行下面的脚本:SELECT max_workers_count FROM sys. dm_os_sys_inf o

通常出现threadpool类型的等待意味着当前有大量并行执行计划,或者遇到了 CPU瓶 颈,但是不管是什么情况,都需要经常检查这部分的数据,以确保有足够的线程可用。SELECT COUNT(*) FROM sys.dm_os_workers

 

调度在SQL Server中显示为Scheduler。每个线程会与一个 调度关联,SQL Server上可用的调度数量等于SQL Server上可 用的逻辑CPU数量加上一个额外的专用管理员连接(DAC)。这 部分的信息可以从sys.dm_os_schedulers这个DMV中査询。