执行查询第一篇:基本概念

ljhdo ljhdo     2022-12-13     385

关键词:

SQL Server 是如何执行查询脚本的呢?首先,应用程序连接到SQL Server引擎, 向SQL Server发送请求。一旦应用程序连接到数据库引擎,SQL Server 创建会话(Session),用于表示客户端和服务器端之间数据交换的状态。其次,SQL Server引擎分配Task来接受查询请求,然后,SQL Server把Workder 绑定到Task,开始分配CPU资源和内存资源来处理Task。最后,通过解析、编译和优化,进入查询引擎,真正开始执行查询请求。下图从高层次上概括了SQL Server执行TSQL脚本的流程:

技术图片

对于图中的相关组件,先来了解一下其基本的概念和功能,下面的术语都是在SQL Server OS中实现的。

一,Connections

连接,这是在底层协议上实现的实际的物理连接,在客户端向数据库引擎发送请求之前,必须建立应用程序和数据库引擎之间的物理链接,是应用程序和数据库引擎之间联系的物理通道,有三种连接的类型:TCP socket,命名管道(named pipe)和共享内存(shared memory)。相关的DMV:sys.dm_exec_connections。

二,Sessions

会话,当客户端应用程序连到SQL Server时,两端就会建立起一个“会话”用于交换信息。严格来说,会话不是底层的物理连接,是SQL Server对连接的逻辑表示,用于存储在数据库引擎和应用程序之间连接时所需要的设置,比如,登陆信息,事务的隔离级别,会话的SET选项等。但是,在实际应用中,通常可以把会话视为连接。

当发现一个session有多个值时,意味着出现了并行查询。一个并行查询使用相同的会话来连接客户端,但是在SQL Server端使用多个Worker(Thread)用于服务这个请求。相关DMV:sys.dm_exec_sessions,当你看到有多行数据有相同的Session ID时,这是因为SQL Server 使用多个线程来处理一个查询请求。

通常情况下,一个Connection对应一个Session,有时,可能存在多个Session对应一个Connection的情况,这是MARS(Multiple Active Result Sets)现象。

三,Request

请求,在SQL Server 的语境下,是查询或批处理的逻辑表示。SQL Server是一个 Client-Server平台,客户端与服务器(后端数据库)交互的唯一方式是通过发送包含命令的请求到数据库,而客户端与服务器端交互的协议简称为TDS(Tabular Data Stream)。应用程序使用SqlClient、OleDB、ODBC、JDBC等驱动来实现这种协议。当应用程序需要对数据库执行任何操作时,它都通过TDS协议向数据库引擎发送一个请求(request)。

简单来说,每次对数据库的操作都会以“请求”的形式发送给数据库服务器,发送请求有多种类型,主要是:Batch Request、RPC Request、Bulk Load Request。

  • Batch Request:批请求,此请求类型仅包含要执行的批处理的T-SQL文本。
  • RPC Request:远程过程调用请求(Remote Procedure Call Request),用于执行存储过程。
  • Bulk Load Request:大容量加载请求,用于执行大容量插入(Bulk Insert)操作

相关的DMV是:sys.dm_exec_requests。

四,Tasks

任务,表示SQL Server 需要处理的一个请求。一个或多个Task会被分配用于完成一个请求。在一个完整的TDS请求达到数据库引擎时,SQL Server将会创建一个任务(Task)来处理请求。当Request到达SQL Server之后,后续操作都发生在SQL Server内部。用户可以从  sys.dm_exec_requests 查看数据库引擎接收到的所有请求。一旦一个Task接收一个请求,Task的状态由PENDING 转变为可用。

当任务被创建用于处理请求时,该Task将代表请求从开始到完成的整过程。例如,如果请求是SQL Batch类型的请求,则任务将代表整个批次,而不是单个语句,SQL Batch中的单个语句不会创建新任务。批处理中的某些个别语句可以并行执行(通常称为DOP,并行度),在这种情况下,任务将产生新的子任务以并行执行。如果请求返回结果,则当客户端完全使用结果时(例如,当您处置SqlDataReader时),批处理就完成了。您可以通过查询sys.dm_os_tasks 来查看服务器中的任务列表。

当一个新请求到达服务器并且创建一个对应的任务时,首先会处于PENDING(挂起状态),任务的状态可以有:

  • PENDING:正在等待工作线程(Worker Thread)。
  • RUNNABLE:可运行,但正在等待接收一个时间片(quantum)。
  • RUNNING:当前正在Scheduler中运行。
  • SUSPENDED:拥有worker,但是正在等待某些事件(向RUNNABLE转变)
  • DONE:已经完成。
  • SPINLOOP:陷入自旋锁。

当新的请求到达服务器并创建任务以处理该请求时,处于PENDING状态。在此阶段,服务器尚不知道请求实际上是什么。该任务必须首先开始执行,为此,引擎必须为其分配一个工作程序(Worker)。

五,Workers

工作进程(Workder Thread),简称为Workder,或Thread,逻辑上对应于操作系统的线程,线程是操作系统可以执行的最小处理单元,并允许将应用程序逻辑上分为多个并发执行路径。SQL Server服务器在启动时会创建一定数量的Worker(工作程序),并且可以按需创建更多工作程序,直到配置的最大工作程序线程(max worker threads)。只有Worker才能执行代码,Worker等待PENDING任务变为可用(当Task被分配用于处理请求),然后每个Workder被分配到一个Task,并执行该Task。Workder会一直执行(running),直到任务完全完成。

当没有更多可用的Worker(工作进程)时,正在等待处理(PENDING)的任务将不得不等待,直到正在执行的(running)任务完成,或者执行该任务的Workder变得可用,能够执行下一个PENDING的任务为止。

对于一个SQL批处理请求,承担该任务的工作进程将执行整个SQL批处理(每个语句)。对于SQL批处理中的语句(=> request => task => worker)是否可以并行执行,答案是否定的,因为它们是在单个线程(=> worker)上执行的,所以每个语句必须按照顺序来执行。

对于使用并行选项(DOP> 1)的语句,SQL Server会创建子任务,每个子任务都会经历完全相同的周期:创建子任务(PENDING),工作程序必须拾取子任务并执行(与SQL批处理工作者不同的工作程序),通过查询sys.dm_os_workers可以查看SQL Server中工作程序的列表和状态。

六,Scheduler

调度程序(Scheduler)是指SOS scheduler,用于管理Worker对CPU时间的需求,协调各个Worker对CPU资源的利用。每一个Scheduler都映射到一个单独的CPU,Workder在一个调度程序中保持活跃/运行(Running)的时间称作一个时间片(Quantum),最长时长为4毫秒。在其时间片到期之后,一个Worker主动退出,把时间片让给其他需要访问CPU资源的Workder,并修改自身的状态为RUNNABLE,这种调度方式称为非抢占式调度。

SOS Scheduler是非抢占式的,数据库对各种请求分配的时间都是相同的,而操作系统的调度模式抢占式的,当出现紧急情况时,按照优先级,高优先级进程抢占把低优先级低的资源。

 

参考文档:

Thread and Task Architecture Guide

Understanding how SQL Server executes a query

Understanding how SQL Server executes a query

T-SQL执行内幕(1)——简介

c++11多线程第一篇:并发基本概念及实现,进程线程基本概念

...发、进程、线程的基本概念和综述1.1.1并发、并行1.1.2可执行程序1.1.3进程1.1.4线程1.1.5程序、进程、线程1.1.6学习心得1.2线程概念讲解1.2.1什么是线程1.2.2线程的优点1.2.3线程的缺点1.2.4线程的异常1.2.5线程的用途1.3并发的实现方法1.... 查看详情

uart学习之路基本概念

第一篇博客,首先记录一下这一个多星期来的学习内容。UART学习之路第一篇,是UART的基本概念介绍。后续会用STM32F407的串口与PC机通信。最后使用VerilogHDL写出串口发送模块和接收模块,完成仿真,在Zedboard板上完成通信。首先... 查看详情

elasticsearch第一篇(入门篇)

...的全文搜索引擎基本概念NearRealtime(NRT):es是一个接近实时查询平台,意味从存储一条数据到可以索引到数据时差很小,通常在1s内Cluster:es是一个分布式、可扩展的平台,可由一个或多个服务器通过定义的cluster.name(默认为elasticsearc... 查看详情

java全栈第一篇-流程控制语句

...为什么要实现流程控制?意义在哪里?基本介绍:语句的执行顺序对程序执行的结果是有影响的,只有清楚语句的执行流程,我们才能正确的预估程序的运行结果,所以我们要采用控制语句来实现我们对语句执行顺序的把控。1.2... 查看详情

第一篇博客应该发点什么呢

接下来几天计划要总结的知识体系:1.群论 1.基本概念 2.表示理论 3.点群 4.量子力学中的应用2.固体物理3.半导体物理4.钙钛矿太阳电池(PSCs) 1.基本结构 2.基本性质 3.缺陷 4.实验手段2021年暑假结束前计... 查看详情

plc状态机编程第一篇-状态机介绍

状态机的一般概念过去我在学习PLC编程时,看的大部分书仅仅停留在软件的操作上,没有真正讲述如何组织程序,这里我们讲一个通用的描述控制算法的方法,就是状态机,和SFC很类似,其实SFC也是源于状态机啦。状态机是UML中... 查看详情

数据结构第一篇

一、基本概念定义数据、数据元素、数据项、数据对象、数据结构的定义;数据 (Data)是描述客观事物的数、字符以及所有能输入到计算机中并被计算机程序处理的符号的总称。如数学计算中用到的整数和实数。数据元素(Data... 查看详情

第一章基本概念

.../sourceforge.net/projects/guitasm8086/?source=typ_redirect虚拟机: 可以执行翻译或解释 一般结构为:数字结构->微指令->指令集->操作系统->汇编->高级语言在内存中,左边是高位,右边是低位 2进制转十进制=d*(n-1)^2+剩下的一样 十进制... 查看详情

8086汇编第一部分:基本概念(代码片段)

...表示各种二进制指令,便于人们的阅读。因为机器只能够执行二进制的机器指令,无法理解汇编指令,所以需要有一个叫做编译器的软件将汇编语言源代码翻译成对应的二进制机器指令。再将翻译而来的二进制指令交由CPU去执行... 查看详情

#技术人为什么写博客#mysql事务--第一篇

...户的1000元,然后再为​​B​​账号增加1000元。如果全部执行成功,数据库处于一致性;如果仅执行完​​A​​​账户金额的修改,而没有增加​​B​​账户的金额,则数据库就处于不一致状态,这时就需要取消前面的操作。... 查看详情

http/2探索第一篇——概念

版权声明:本文由张浩然原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/87来源:腾云阁 https://www.qcloud.com/community 一.现状现在网络优化的瓶颈是什么?你可能会说,带宽。也许在2014年前,... 查看详情

第一篇:认识并发

... 个人理解:并发是为了程序运行的更快,通过多线程执行任务达到快速运行目的。线程、进程概念区别:  进程和线程都是一个时间段的描述,是CPU工作时间段的 查看详情

elasticsearch技术实战——第一篇(使用篇)(代码片段)

...一些使用心得体会,希望对大家有所帮助。计划分三篇:第一篇(使用篇),主要讲解基本概念、分词、数据同步、搜索API。第二篇(配置及参数调优篇),主要围绕JVM参数调优、异常排查、安全性等方面讲解。第三篇(倒排索... 查看详情

第一篇:数据领域重点概念澄清

前言“数据治理”简简单单四个字却涉及组织、制度、机制、技术、标准等非常多的内容,是一门复杂综合性学科,而且是很多数据类项目的基础性、前置性工作,很多项目或多或少都会涉及到数据治理相关工作࿰... 查看详情

第一篇:数据领域重点概念澄清

前言“数据治理”简简单单四个字却涉及组织、制度、机制、技术、标准等非常多的内容,是一门复杂综合性学科,而且是很多数据类项目的基础性、前置性工作,很多项目或多或少都会涉及到数据治理相关工作࿰... 查看详情

kafka消息队列大数据实战教程-第一篇(kafka基础入门)

文章目录前言一、概念1.1消息队列的两种模式1.1.1点对点模式1.1.2发布订阅模式1.2消息队列的优点1.3核心架构图解二、基本术语2.1核心2.2分区与副本设置2.1.1案例12.1.1案例2三、常用操作命令3.1创建主题3.2列出主题3.3主题详情3.4修... 查看详情

kafka消息队列大数据实战教程-第一篇(kafka基础入门)

文章目录前言一、概念1.1消息队列的两种模式1.1.1点对点模式1.1.2发布订阅模式1.2消息队列的优点1.3核心架构图解二、基本术语2.1核心2.2分区与副本设置2.1.1案例12.1.1案例2三、常用操作命令3.1创建主题3.2列出主题3.3主题详情3.4修... 查看详情

一篇帮你搞定jvm基本概念(超详细)(代码片段)

一、整体框架二、核心知识学习基本概念(1)定义JVM:Javavirtualmachine,即Java虚拟机;是可运行Java代码的假想计算机,包括一套指令集、一组寄存器、一个栈、一个垃圾回收、堆和一个存储方法域。JVM运行OS之... 查看详情