1.当客户端执行一条T-SQL语句给SQL Server服务器时,会首先到达服务器的网络接口,网络接口和客户端之间有协议层。
2.客户端和网络接口之间建立连接。使用称为“表格格式数据流”(TDS) 数据包的 Microsoft 通信格式来格式化通信数据。
3.客户端发送TDS包给协议层。协议层接收到TDS包后,解压并分析包里面包含了什么请求。
4.命令解析器解析T-SQL语句。命令解析器会做下面几件事情:
(1)检查语法。发现有语法错误就返回给客户端。下面的步骤不执行。
(2)检查缓冲池(Buffer Pool)中是否存在一个对应该T-SQL语句的执行计划缓存。
(3)如果找到已缓存的执行计划,就从执行计划缓存中直接读取,并传输给查询执行器执行。
(4)如果未找到执行计划缓存,则在查询执行器中进行优化并产生执行计划,存放到Buffer Pool中。
5.查询优化器优化SQL语句
当Buffer Pool中没有该SQL语句的执行计划时,就需要将SQL传到查询优化器,通过一定的算法,分析SQL语句,产生一个或多个候选执行计划。选出开销最小的计划作为最终执行计划。然后将执行计划传给查询执行器。
6.查询执行器执行查询
查询执行器把执行计划通过OLE DB接口传给存储引擎的数据访问方法。
7.数据访问方法生成执行代码
数据访问方法将执行计划生成SQL Server可操作数据的代码,不会实际执行这些代码,传送给缓冲区管理器来执行。
8.缓冲区管理器读取数据。
先在缓冲池的数据缓存中检查是否存在这些数据,如果存在,就把结果返回给存储引擎的数据访问方法;如果不存在,则从磁盘(数据文件)中读出数据并放入数据缓存中,然后将读出的数据返回给存储引擎的数据访问方法。
9.对于读取数据,将会申请共享锁,事务管理器分配共享锁给读操作。
10.存储引擎的数据访问方法将查询到的结果返回关系引擎的查询执行器。
11.查询执行器将结果返回给协议层。
12.协议层将数据封装成TDS包,然后协议层将TDS包传给客户端。