解析SQL Server之任务调度
在前面两篇文章中( 浅谈SQL Server内部运行机制 and 浅谈SQL Server数据内部表现形式 ),我们交流了一些关于SQL Server的一些术语,SQL Sever引擎
与SSMS抽象模型,SQL Server内部存储机制和SQL Server内部体系结构等。讨论的这些问题,均可以归为一个问题,即"SQL Server是怎么执行客户端输入的SQL
语句的?”,其中,重点讨论了下图(SQL Server 体系结构)
然而,如果我们仅仅了解如上技术,是不具备一个资深DBA或数据库优化高手条件的,原因很简单,我们仅仅知道了SQL Server是怎么做的(SQL Server是如
何执行SQL语句的),但是我们并不知到是什么做的(是什么真正执行SQL语句?),只知其然,而不知其所以然。本篇文章,我们将重点论述是什么执行了SQL Server
体系结构逻辑?其实,执行SQL Server体系结构逻辑的核心组件便是SQLOS(简称SQL Server操作系统)。
一 SQL Server引擎组件
下图为SQL Server引擎核心主件,它大致包括五大部分:协议层(Protocol Layer),查询引擎(Query Processor),存储引擎(Storage Engine),公用组件(Utilities)和
SQL Server操作系统(SQLOS)。其中,除了Utilities和SQLOS两大部分外,其他部分在前面两篇文章中均已简要论述。本篇文章,我们将重点论述SQLOS。
(一)SQLOS
SQLOS是SQL Server和Windows OS(Windows 操作系统)瘦用户模式层,它主要负责一些底层的操作,如调度、处理I/O、内存管理、文件管理等。
当客户端(如在SSMS中输入)输入一条SQL语句(SELECT * FROM TableName),并基于TDS服务点,向SQL Server服务引擎提交该语句,SQL Sever引擎接收到
该语句后(准确来说,是先通过Protocol Layer协议层),查询引擎的命令分析器(Query Processor)先检查语法结构,若语法结构有错误,则直接将错误返回给客户端,
编译不通过;若语法正确,则命令分析器会去缓冲池的计划任务中寻找是否存在该语句的缓存,若存在,则命令分析器把该计划缓存交给查询执行器处理,若缓存池的计
划缓存中没有该计划任务,则命令解析器将会生成查询树,并将该SQL语句传递给查询优化器,查询优化器根据“最少开销算法”生成最优方案,然后传递给查询执行器;
流程到查询执行器后,查询执行器通过存储引擎的访问方法传递给存储引擎,存储引擎根据规则来配置和使用缓冲区管理器和事务管理器,接下来的工作,就交给
SQLOS来处理。
也许读者会问?为什么不直接用Windos OS来调度,而要另做一个SQLOS来执行调度呢?因为Windows OS是基于“抢占式调度算法的”,这种算法依据时间片来执行的,
这种算法并没有针对SQL Server进行优化,为了解决这个问题,微软决定SQL Server应自己处理自己的调度,并通过创建用户模式调度器(UMS)来解决该问题,UMS基于
“合作调度模式”算法被设计,这种算法指当执行中的线程需要等待其他资源才能执行时,不会因为时间片的轮询被中断,而是采用自动退出处理器的方式。
(二)线程三态
当在一个会话中执行请求时,SQL Server将这项工作(这个请求)分成一个或多个任务,每个任务由一个线程负责,任务被放在任务队列中,等待调度器去调度工作线程来执行,
原则上,调度器会为每个任务分配一个工作线程,这个工作线程就负责执行该任务。每个线程都有三个状态,即执行状态(Running)、挂起状态(Suspend)和可执行状态(Runable)。
- 执行状态(Running):表示该线程正在执行任务
- 挂起状态(Suspend):表示该线程因缺资源,被CPU强制挂起,如尝试修改被锁的表
- 可执行状态(Runnable):表示线程具备了可执行任务的条件,如线程1执行完任务1后,被放在线程队列中,等待调度器分配任务
线程三个状态之间,存在如下转换关系:
1.具备执行条件的线程(Runnable),只要获得CPU,就可执行任务,从而从Runnable状态变成Running状态
2.正在执行的线程(Running)因缺必要资源,被cpu挂起,从而从Running状态变成Suspend状态
3.被挂起的线程(Suspend)因获得可执行的资源,被cpu唤醒执行,从而从Suspend状态变成Running状态
4.Runnable状态的线程,调度器可不让其执行(这里,暂且称之为Suspeng状态)
(三)Windows OS与SQL Server
当一台电脑刚生产出来,未装任何系统时,我们称之为裸机,对于裸机,我们是无法使用的,若要使用,则需要安装操作系统,如win10,
当我们在裸机上装上操作系统后,就可以通过操作系统来操作电脑了,如查看cpu,管理文件,管理内存等,不仅仅如此,我们还在操作系统上
安装相应的运用软件,如Visual Studio 2017,SQL SERVER 2014等。
二 SQL Server一个较为完整的调度流程
当SSMS向SQL Server引擎发起请求时,将会产生一个会话(Session),会话成功后,就可以执行SQL语句请求了。
1.当建立会话成功后,在会话中建立一个SQL语句请求时(如执行查询语句:SELECT * FROM TableName),会话会将一个请求分成一个或多个任务,并将这些任务放在任务队列中;
2.每个任务都会被分配一个或多个工作线程来执行;
3.SQLOS任务调度器通过从工作线程队列中调度线程来执行相应的工作任务
注意:SQLOS只是逻辑的,真的的执行还是Windows OS
以下是一些涉及到的相关类型表
sys.dm_exec_*:该类型表包含用户代码执行和关联连接直接或间接相关的信息,如请求表sys.dm_exec_requests,会话表sys.dm_exec_sessions
sys.dm_os_*: 该类型表包含操作OS相关的信息
sys.dm_tran_*: 该类型表包含事务相关信息
sys.dm_logpool_*:该类型包含日志相关信息
sys.dm_io_*: 该类型表包含IO相关信息
sys.dm_db_*: 该类型包含数据库相关信息
三 参考文献
【01】《Microsoft SQL Server 2012 Internals》Kalen Delaney,Bob Beauchemin,Conor Cunningham,Jonathan Kehayias,Benjamin Nevarez,Paul S.Randal
【02】《Microsoft SQL Server 2012 Administration》Tom Carpenter
【03】《SQL Server 2012 深入解析与性能优化 第3版》Christian Bolton,Justin Langford,Glenn Berry,Gavin Payne,Amit Banerjee,Rob Farley著
【04】《Microsoft SQL Server 2008 技术内幕:T-SQL查询》ltzik Ben-Gran,Lubor Kollar,Dejan Sarka,Steve Kass著
【05】《SQL Server 2008查询性能优化》Grant Fritchey,Sajal Dam著
四 版权区
- 感谢您的阅读,若有不足之处,欢迎指教,共同学习、共同进步。
- 博主网址:http://www.cnblogs.com/wangjiming/。
- 极少部分文章利用读书、参考、引用、抄袭、复制和粘贴等多种方式整合而成的,大部分为原创。
- 如您喜欢,麻烦推荐一下;如您有新想法,欢迎提出,邮箱:2098469527@qq.com。
- 可以转载该博客,但必须著名博客来源。
解析SQL Server之任务调度的更多相关文章
- 深入解析SQL Server并行执行原理及实践(上)
在成熟领先的企业级数据库系统中,并行查询可以说是一大利器,在某些场景下他可以显著的提升查询的相应时间,提升用户体验.如SQL Server, Oracle等, Mysql目前还未实现,而Postgre ...
- 全面解析SQL SERVER 的左右内连接
SQL SERVER数据库的三种常用连接解析: 这里先给出一个官方的解释: left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右 ...
- 深入解析SQL Server并行执行原理及实践(下)
谈完并行执行的原理,咱们再来谈谈优化,到底并行执行能给我们带来哪些好处,我们又应该注意什么呢,下面展开. Amdahl’s Law 再谈并行优化前我想有必要谈谈阿姆达尔定律,可惜老爷子去年已经驾鹤先 ...
- 深入解析 SQL Server 高可用镜像实现原理
作者:郭忆 本文由 网易云 发布. SQL Server 是 windows 平台 .NET 架构下标配数据库解决方案,与 Oracle.MySQL 共同构成了 DB-Engines Ranking ...
- 深入解析SQL Server高可用镜像实现原理
本文来自网易云社区 SQL Server 是windows平台.NET架构下标配数据库解决方案,与Oracle.MySQL共同构成了DB-Engines Ranking的第一阵营,在国内外企业市场中有 ...
- 深入解析SQL Server并行执行原理及实践
http://dbaplus.cn/news-21-431-1.html
- 深入解析SQL Server并行执行原理及实践(上) ---高继伟
http://www.cnblogs.com/shanksgao/p/5497106.html
- SQL SERVER SQLOS的任务调度
原文:SQL SERVER SQLOS的任务调度 原文地址:http://blogs.msdn.com/b/apgcdsd/archive/2011/11/24/sql-server-sqlos.as ...
- SQL Server技术内幕笔记合集
SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...
随机推荐
- 关于Vue.use()使用详解
问题 相信很多人在用Vue使用别人的组件时,会用到 Vue.use() .例如:Vue.use(VueRouter).Vue.use(MintUI).但是用 axios时,就不需要用 Vue.use( ...
- gitbook 入门教程之 gitbook 简介
gitBook 是一个基于node.js的命令行工具,使用 github/git 和 markdown/asciiDoc 构建精美的电子书. gitbook 支持输出静态网页和电子书等多种格式,其中默 ...
- sqlserver2014无法打开报Cannot find one or more components_修复方案
前言:我跟网上大家的原因基本一样,就是好久没用sqlserver了,中间也对VS进行过卸载升级等,突然有一天发现,打开Sqlserver时打不开了,出了一个弹框:Cannot find one or ...
- Linux 桌面玩家指南:05. 发博客必备的图片处理和视频录制神器
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...
- Quartz简单实现定时任务管理(SSM+Quartz)
首先你得有一个用Maven搭好的SSM框架,数据库用的Mysql,这里只有关于Quartz的部分.其实有大神总结的很好了,但做完后总有些地方不一样,所以写这篇作为笔记.这里先把大神的写的分享给大家:h ...
- 简单读!zookeeper单机模式的启动逻辑
zk用处如此之多,以至于每个地方都要你理解zk原理! 请按如下操作姿势打开: 1. 打开zk的git仓库地址:https://github.com/apache/zookeeper , 确认过眼神,它 ...
- Android开发:Android Studio开发环境配置
一.android studio下载: 1.Windows版: 下载地址:https://pan.baidu.com/s/1-sg4dN_2B5nn2YJf-C7XLQ 提取码:yedc 2.Mac版 ...
- mysql的学习笔记(二)
1.数据类型,存储的类型. 整型 TINYINT 有符号-128到127 无符号值:0到255 1字节 SMALLINT 有符号 -32768到32767 0到65535 2字节 MEDIUMINT ...
- Floor报错原理分析
最近开始打ctf了,发现好多sql注入都忘了,最近要好好复习一下. 基础知识: floor(): 去除小数部分 rand(): 产生随机数 rand(x): 每个x对应一个固定的值,但是如果连续执行多 ...
- ES 05 - 通过Kibana管理Elasticsearch集群服务
目录 1 检查集群的健康状况 2 查看集群中的节点个数 3 查看集群中的索引 4 简单的索引操作 4.1 创建索引 4.2 删除索引 在本篇文章之前, 需要完成: ① 启动Elasticsearch服 ...