【SQLServer】SQLServer中的名词解释
2022-09-14 09:03 abce 阅读(112) 评论(0) 编辑 收藏 举报调度程序(Scheduler)
在SQL Server中管理线程调度并允许线程暴露给CPU的对象(通过sys.dm_os_schedulers查看)。Scheduler不控制事情,而是让worker线程相互合作,依靠他们的合作(合作调度模式)。每个Scheduler/master(每个逻辑CPU一个)接受新任务并将它们交给worker线程.Scheduler仅允许一次有一个worker线程使用CPU。
任务(task)
任务代表需要执行的工作(通过sys.dm_os_tasks查看)。一个任务包含以下事件之一:查询(RPC事件或语言事件)、预登录(prelogin 事件)、登录(连接事件)、注销(断开连接事件)、查询取消(注意事件)、批量load(批量加载事件),分布式事务(事务管理器事件)。请注意,这些是在SOS调度程序层(SOS scheduler)跟踪的(因此需要通过查看dm_OS_tasks)。
工作线程(worker thread)
这是线程的逻辑表示(将其视为OS线程之上的包装器)。它是调度程序中的一个结构,它维护有关工作线程所做工作的的信息。
线程(thread)
这是通过CreateThread()/_beginthreadex()等调用创建的操作系统线程。通过查看sys.dm_os_threads。一个Worker线程对应一个操作系统线程。
请求(Request)
请求是从客户端应用程序向SQL Server发出的查询请求的逻辑表示(sys.dm_exec_requests)。查询请求被分配给了一个任务(task),调度程序(scheduler)将该任务交给一个工作线程(worker)来处理。
SQL Server是一个C/S平台,客户端与服务器(后端数据库)交互的唯一方式是通过发送包含命令的请求到数据库。客户端与服务器端交互的协议简称为TDS(Tabular Data Stream)。当应用程序需要对数据库执行任何操作时,它都通过TDS协议向数据库引擎发送一个请求(request)。
应用程序可以使用以下几种实现了TDS协议的客户端来发起请求:
·CLR managed SqlClient
·OleDB
·ODBC
·JDBC
·PHP Driver for SQL Server
·开源的FreeTDS
简单来说,每次对数据库的操作都会以“请求“的形式发送给数据库,发送请求有多种类型:
1.批请求(Batch Request)
请求类型仅包含要执行的批处理的T-SQL文本。这种请求不包含参数,但是T-SQL文本可以包含本地变量。
2.远程过程调用请求(Remote Procedure Call Request)
这种类型的请求包含过程标识符(procedure identifier),以及任何数量的参数。
3.批量加载请求(Bulk Load Request)
用于批量插入操作。
TDS请求到达数据库引擎后,SQLServer会创建一个任务来处理请求。可以从sys.dm_exec_requests查看请求。
会话(Sessions)
当客户端应用程序连接到SQL Server时,双方建立一个“会话”来交换信息。严格来说,会话与底层物理连接不同,它是SQL Server连接的逻辑表示。但出于实际目的,你可以将其视为一个连接(会话=~连接),请参阅sys.dm_exec_sessions。这是SQL Server 2000和更早版本中存在的旧SPID(会话进程ID)。对于系统会话(由SQL Server生成的内部会话,如LazyWriter、Checkpoint、Log Writer、Service Broker等),没有外部物理连接映射到会话。只有一个session_id 存在。通常为预留的<50的会话ID,但可以是更高的值。
有时可能会注意到一个会话在DMV输出中重复多次。这是由于并行查询而发生的。并行查询使用相同的会话与客户端通信,但在SQL Server端分配了多个工作线程来服务此查询请求。因此,如果看到具有相同会话ID的多行,就知道查询请求正在由多个线程提供服务。session_id(SPID)用于标识在SQL Server中执行的工作。例如,你可能想要找出哪个session_id正在执行查询,或者哪个session_id的查询被取消了。会话的一些属性包括登录时间、上次请求(查询)时间、CPU 消耗、使用的内存以及此会话上的一个查询或一组查询使用的总运行时间、用户名、为此会话配置的SET选项。
连接(Connection)
这是在较低协议级别建立的实际物理连接,通过sys.dm_exec_connections具有其所有特性。
会话和连接之间存在1:1映射。连接具有以下一些属性:协议(共享内存、TCP、命名管道)、身份验证类型(NTLM、Kerberos)、加密(打开或关闭)、网络数据包大小、客户端 IP 地址和端口。这些都是连接的物理特性。sys.dm_exec_connections中的connection_id是一个GUID,用于唯一标识该物理连接。通常不会使用connection_id来识别正在执行查询的会话;而是使用session_id。
组件之间的互连
客户端应用程序创建到SQL Server的物理连接。然后应用程序发送一个预登录请求,创建一个任务并将其分配给worker线程来完成。一旦服务器和客户端完成预登录过程,就会发送登录请求,并形成另一个任务并将其移交给工作线程。登录完成后,SQL Server 会创建一个会话,该会话代表此逻辑连接,它将与客户端交换信息。当客户端应用程序发送查询请求(或 DTC 或批量加载)时,服务器再次创建任务并将其分配给工作线程以完成。如果查询在执行过程中被取消,由于某种原因,服务器将收到一个注意请求,IOCP 侦听器将在该请求上标记查询已取消,并且正在运行查询的工作线程将在它看到时停止执行位。另一方面,如果允许完成查询,并且客户端应用程序已完成,它可以发送断开连接或注销请求。