SQL server组件

SQL Server组件

dua66x.jpg

关系引擎

关系引擎又称为查询处理器,它包含的SQLServer组件用于确定查询需要完成的任务,以及如何实现的最佳方案.关系引擎包含两个主要的部分:查询优化和**查询执行.**查询优化器也是关系引擎中最复杂的组件,甚至是整个SQLServer产品中最复杂的组件,它用于确定批处理中查询的最佳执行方案

包含三大组件:

(1)命令解析器(query parser):检查语法和转换查询树

(2)查询优化器(query optimizer):负责执行查询

(3)查询执行器(query executor):优化查询

命令解析器

命令解析器处理用户发往SQLServer的T-SQL语言事件.它检查语法的正确性,并将T-SQL命令转换成可以进行操作的内部格式.这种内部格式称为查询树.如果解析器无法识别语法,将立即引起语法错误,并标示出现错误的位置.不过,非语法错误消息不能明确显示引起错误的源行.因为只有命令解析器可以访问语句源代码,真正执行命令时,源代码格式中的语句将不再有效.

**1. 查询高速缓存(library cache) **

服务器进程在接到客户端传送过来的SQL语句时,不会直接去数据库查询,而是会先在数据库的高速缓存中去查找是否存在相同语句的执行计划。如果在数据高速缓中, 则服务器进程就会直接执行这个SQL 语句,省去后续的工作。所以,采用高速数据缓存的话, 可以提高SQL 语句的查询效率。一方面是从内存中读取数据要比从硬盘中的数据文件中读取数据效率要高,另一方面,也是因为这个语句解析的原因。 不过这里要注意一点,这个数据缓存跟有些客户端软件的数据缓 存是两码事。有些客户端软件为了提高查询效率,会在应用软件的客户端设置数据缓存。由于这些数据缓存的存在,可以提高客户端应用软件的查询效率。但是,若其他人在服务器进行了相关的修改,由于应用软件数据缓存的存在,导致修改的数据不能及时反映到客户端上。从这也可以看出,应用软件的数据缓存跟数据库服务器的高速数据缓存不是一码事。

**2. 语句合法性检查(data dict cache) **

当在高速缓存中找不到对应的SQL 语句时,则服务器进程就会开始检查这条语句的合法性。这里主要是对SQL 语句的语法进行检查,看看其是否合乎语法规则。如果服务器进程认为这条SQL 语句不符合语法规则的时候,就会把这个错误信息,反馈给客户端。在这个语法检查的过程中, 不会对SQL语句中所包含的表名、列名等等进行检查,它只是语法上的检查。

**3. 语言含义检查(data dict cache) **

若SQL 语句符合语法上的定义的话,则服务器进程接下去会对语句中的字段、表等内容进行检查。看看这些字段、表是否在数据库中。如果表名与列名不准确的话,则数据库会就会反馈错误信息给客户端。所以, 有时候我们写select语句的时候,若语法与表名或者列名同时写错的话,则系统是先提示说语法错误,等到语法完全正确后,再提示说列名或表名错误。

4.将SQL解析成抽象语法树,按照不同的算法策略并做一些替换其中视图、表达式,合并查询等优化,去生成由关系代数算子组成的(投影 (π),选择 (σ),自然连接 (⋈),聚集运算(G)等算子)不同逻辑执行计划

抽象语法树AST

这颗树定义了代码的结构,通过操纵这颗树,我们可以精准的定位到声明语句、赋值语句、运算语句等等,实现对代码的分析、优化、变更等操作

1.词法分析

也叫做扫描scanner。它读取我们的代码,然后把它们按照预定的规则合并成一个个的标识tokens。同时,它会移除空白符,注释,等。最后,整个代码将被分割进一个tokens列表(或者说一维数组)。当词法分析源代码的时候,它会一个一个字母地读取代码;当它遇到空格,操作符,或者特殊符号的时候,它会认为一个话已经完成了。生成树的时候,解析器会删除一些没必要的标识tokens(比如不完整的括号)

2.语法分析

也称解析器,它会将词法分析出来的数组转化成树形的表达形式。同时,验证语法,语法如果有错的话,抛出语法错误。

查询优化器

它的主要工作是优化数据访问,根据提交的SQL语句,综合各种已有的信息(主要是系统编目表)来产生最优的可执行的访问方案。

优化器在整个数据库系统中占据着至高无上的地位,它是数据库性能的决定因素,是所有数据库引擎中最重要的组件。

查询优化器从命令解析器中获取查询树, 并为执行查询准备查询树.无法优化的语句,如控制流和数据定义语言命令,将被编译成内部形式.可优化的语句将被做上标记,然后传递到查询优化器中.查询优化器主要涉及数据操作语言语句SELECT,INSERT,DELETE和UPDATE,这些语句可以按多种方式进行处理,查询优化器将从许多可能的方式中选择一种最佳方式.查询优化器将编译整个命令批处理,优化可优化的查询,并检查安全性.该查询优化和编译将产生一个执行计划.
**第一步:**规范每个查询,该过程可以将单个查询分解成多个细化的查询.查询优化器规范查询后,将对查询进行优化,这意味着它将为执行查询确定计划.查询优化是基于成本的,查询优化器基于内部指标选择消耗最少的计划,内部指标包括评估内存需求,CPU利用率和需要的IO数目.查询优化器将根据请求语句类型,检查各种相关表中的数据量,查看每个表中可用的索引,然后查看查询中引用的每个索引或列的数据值采样.数据值采样名为分发统计信息.根据可用的信息,查询优化器分析查询中各种可用的访问方法和处理策略,并选择成本效益最高的计划.
**第二步:**完成规范化和最优化之后,这些过程产生的规范化树将被编译成执行计划.执行计划实际上是一种数据结构.执行计划中的每个命令精确指定了将涉及哪些表,将使用哪些索引,将检查哪些安全性,以及哪些条件在选择中的值必须为TRUE.这种执行计划表面上看视乎很简单,但其实内部过程相当复杂.除了实际的命令,执行计划还包括所有必须执行的步骤,以确保对约束条件进行检查.调用触发器的步骤和验证约束条件略有不同.如果操作行为中已经包含了触发器,还需要追加包含触发器的过程调用.如果触发器是instead-of触发器,触发器计划的调用将替换实际的数据修改命令.对after触发器而言,触发器计划在修改语句激活触发器之后和提交修改之前执行.与约束条件验证步骤不同的是,触发器的特定步骤没有编译到执行计划中.向包含多个约束条件的表插入一行的简单请求可以导致执行计划访问多个其他表,或者计算表达式的操作.另外,触发器的存在还可以导致更多步骤的执行,执行真正的insert语句的步骤也许只是整个执行计划的一小部分,但整个执行计划需要确保执行所有与添加一行相关的操作和约束.

查询执行器

查询执行器运行查询优化器产生的执行计划,在执行计划中充当所有命令的调度程序.批处理完成之前,该模块将逐步跟踪执行计划的每个命令.大多数命令需要与存储引擎进行交互来修改或检索数据以及管理事务和锁.

存储引擎

存储引擎包含需要真正访问和修改磁盘数据的组件,包含三大组件:

(1)事务管理器:通过锁来管理数据及维持事务的ACID属性。

(2)数据访问方法:处理对行、索引、页、行版本、空间分配等的I/O请求。

(3)缓冲区管理器:管理SQL Server的主要内存消耗组件Buffer Pool。

Buffer Pool

他是一个非常关键的组件,数据库中的数据实际上最终都是要存放在磁盘文件上的。 在对数据库执行增删改操作的时候,实际上主要都是针对内存里的Buffer Pool中的数据进行的,也就是实际上主要是对数据库的内存里的数据结构进行了增删改。同时引入了一个redo log机制,你在对内存里的数据进行增删改的时候,他同时会把增删改对应的日志写入redo log中,用于数据库崩溃时进行恢复。

事务日志

每个 SQL Server 数据库都具有事务日志,用于记录所有事务以及每个事务对数据库所做的修改,是保证事务ACID属性的重要组件, 如果系统出现故障,你将需要依靠该日志将数据库恢复到一致的状态。

事务日志支持以下操作:

  • 恢复个别的事务
  • 在 SQL Server 启动时恢复所有未完成的事务
  • 将还原的数据库、文件、文件组或页前滚至故障点
  • 支持事务复制
  • 支持高可用性和灾难恢复解决方案: Always On 可用性组、数据库镜像和日志传送

数据文件

1.主数据文件

该文件包含数据库的启动信息,并用于存储数据。每个数据库都有一个主要数据文件。

2.事务日志文件

这些文件包含用于恢复数据库的日志信息。每个数据库都必须至少有一个日志文件。

3.辅助数据文件

这些文件含有不能置于主要数据文件中的所有数据。如果主文件可以包含数据库中的所有数据,那么数据库就不需要次要数据文件。

SQL Server网络接口

建立在客户端和服务器之间的网络连接的协议层

查询的底层原理

1.当客户端执行一条T-SQL语句给SQL Server服务器时,会首先到达服务器的网络接口,网络接口和客户端之间有协议层。

2.客户端和网络接口之间建立连接。使用称为“表格格式数据流”(TDS) 数据包的 Microsoft 通信格式来格式化通信数据。

3.客户端发送TDS包给协议层。协议层接收到TDS包后,解压并分析包里面包含了什么请求。

4.命令解析器解析T-SQL语句

5.查询优化器优化SQL语句

6.查询执行器执行查询

查询执行器把执行计划通过OLE DB接口传给存储引擎的数据访问方法。

7.数据访问方法生成执行代码

数据访问方法将执行计划生成SQL Server可操作数据的代码,不会实际执行这些代码,传送给缓冲区管理器来执行。

8.缓冲区管理器读取数据。

先在缓冲池的数据缓存中检查是否存在这些数据,如果存在,就把结果返回给存储引擎的数据访问方法;如果不存在,则从磁盘(数据文件)中读出数据并放入数据缓存中,然后将读出的数据返回给存储引擎的数据访问方法。

9.对于读取数据,将会申请共享锁,事务管理器分配共享锁给读操作。

10.存储引擎的数据访问方法将查询到的结果返回关系引擎的查询执行器。

11.查询执行器将结果返回给协议层。

12.协议层将数据封装成TDS包,然后协议层将TDS包传给客户端。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值