SQLOS任务调度

总结本文的过程中,参考了如下连接:http://www.cnblogs.com/xugang/archive/2012/06/18/2553625.html,在这里对作者表示感谢。

SQL Server通过WORKER,SCHEDULER,TASK来对任务进行调度。

scheduler对应CPU的core数,如我的服务器有4个物理CPU,共48核,那么可以通过如下语句查得CPU数和scheduler数:

select cpu_count,scheduler_count
 from sys.dm_os_sys_info;

结果如下:
cpu_count    scheduler_count
    48             48


WORKER就是工作线程,是真正执行任务的单元。一个SQl Server的worker数量是有限制的,最大worker数可以如下查询:

select max_workers_count from sys.dm_os_sys_info;

结果如下:
max_workers_count
1216

worker并不是一上来就建这么多个,是按需建立的,如果达到了最大熟练,新来的任务就没有worker可分配,就只能等待其它worker空闲下来。
worker在创建的时候,需要约2MB的内存空间。所以太多的worker会消耗很大的资源。

Connection,Batch和Task的关系

程序通过驱动也好,管理员通过SSMS新建一个查询窗口也好,都会创建一个Connection,连接有一个对应的SPID。

一个Connection中可能有多个SQL语句,就会分成多个Batch

Batch进到SQL Server之后,会被SQLOS拆分成多个Task,这个是由SQL Server自己决定的。
Task是SQL Server执行任务的最小单元。

相关视图:
sys.dm_os_workers       查看worker的相关信息
sys.dm_os_schedulers    查看scheduler的相关信息
sys.dm_os_tasks         查看task的相关信息  有个session_id

引用一个图来表示他们之间的关系:

posted @ 2015-06-03 15:48  听雨残荷  阅读(184)  评论(0)    收藏  举报