【介绍】
SQL Server
通过
WORKER, SCHEDULER, TASK
等来对任务进行调度和处理。了解这些概念,对于了解
SQL Server
内部是如何工作,是非常有帮助的。
通常来讲,
SCHEDULER
个数是跟
CPU
个数相匹配的
。除了几个系统的
SCHEDULER
以外,每一个
SCHEDULER
都映射到一个
CPU
,如下面的查询结果所示,我们有四个
CPU
,也就有相应四个
SCHEDULER
。
SELECT cpu_count,scheduler_count,scheduler_total_count,max_workers_count FROM sys.dm_os_sys_info
而
WORKER (
又称为
WORKER THREAD),
则是工作线程。在一台服务器上,我们可以有多个工作线程。因为每一个工作线程要耗费资源,所以,
SQL Server
有一个最大工作线程数。一个
TASK
进来,系统会给它分配一个工作线程进行处理。但是当所有的工作线程都在忙,而且已经达到了最大工作线程数,
SQL Server
就要等待,直到有一个忙的工作线程被释放。最大工作线程数可以通过下面的查询得到。
SQL SERVER
并不是一开始就把这些所有的工作线程都创建,而是依据需要而创建。
SELECT cpu_count,scheduler_count,scheduler_total_count,max_workers_count FROM sys.dm_os_sys_info
TASK
是由
BATCH
而来。我们知道,一个连接,可以包含多个
BATCH
,而每个
BATCH
则可以分解成多个
TASK
。如下面某一个连接要做的事情。这个连接要做的有两个
BATCH
,而每个
BATCH
,如
SELECT * FROM TABLE_B
,因为可以支持并行化查询,所以可能会被分解成多个
TASK
。具体
BATCH
怎么分解成
TASK
,以及分解成多少个,则是由
SQL Server
内部决定的。
INSERT INTO TABLE_B VALUES (‘aaa’)
GO
SELECT * FROM TABLE_B
GO
【关系】
我们初步了解了
Connection, Batch, Task, Worker, Scheduler, CPU
这些概念,那么,它们之间的关系到底是怎么样呢?
如上图所示,左边是很多连接,每个连接有一个相应的
SPID
,只要用户没有登出,或者没有
timeout,
这个始终是存在的。标准设置下,对于用户连接数目,是没有限制的。