【T-SQL进阶】02.理解SQL查询的底层原理

本系列【T-SQL】主要是针对T-SQL的总结。

一、SQL Server组成部分

1.关系引擎:主要作用是优化和执行查询。

包含三大组件:

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

(2)查询优化器:优化查询。

(3)查询执行器:负责执行查询。

2.存储引擎:管理所有数据及涉及的IO

包含三大组件:

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

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

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

3.Buffer Pool

包含SQL Server的所有缓存。如计划缓存和数据缓存。

4.事务日志

记录事务的所有更改。保证事务ACID属性的重要组件。

5.数据文件

数据库的物理存储文件。

6.SQL Server网络接口

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

二、查询的底层原理

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包传给客户端。

参考资料:

https://msdn.microsoft.com/zh-cn/library/windows/desktop/ms722784(v=vs.85).aspx

《SQL Server 性能优化与管理的艺术》

作  者: Jackson0714 出  处:http://www.cnblogs.com/jackson0714/ 关于作者:专注于微软平台的项目开发。如有问题或建议,请多多赐教! 版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。 特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我 声援博主:您的鼓励是作者坚持原创和持续写作的最大动力!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏沈唁志

WordPress添加评论回复邮件提醒通知功能

19620
来自专栏文渊之博

探索SQL Server元数据(一)

  在数据库中,我们除了存储数据外,还存储了大量的元数据。它们主要的作用就是描述数据库怎么建立、配置、以及各种对象的属性等。本篇简单介绍如何使用和查询元数据,如...

15920
来自专栏L宝宝聊IT

MySQL架构组成、逻辑模块组成

Mysql逻辑结构可以看成是二层架构,第一层通常叫做SQL Layer,在mysql数据库系统处理底层数据之前的所有工作都在这一层完成的,包括权...

10730
来自专栏性能与架构

mysql 执行状态分析

当感觉mysql性能出现问题时,通常会先看下当前mysql的执行状态,使用 show processlist 来查看,例如 mysql> show proces...

43550
来自专栏c#开发者

Oracle 开放源代码项目

Oracle 开放源代码项目 这是无数个可扩展、使用以及构建于 Oracle 技术的开放源代码项目中的一个简短的示例。如果您有自己喜欢的开放源代码项目未在此处列...

92480
来自专栏Laoqi's Linux运维专列

MySQL性能调优 – 你必须了解的15个重要变量

2.6K20
来自专栏数据和云

Library Cache优化与SQL游标

? 冷菠 冷菠,网名悠然(个人主页http://www.orasky.net),资深DBA,著有《Oracle高性能自动化运维》,有近10年的数据库运维、团队...

29450
来自专栏吴柯的运维笔记

部署Cacti监控平台实现网络监控

Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具。 Cacti是通过 snmpget来获取数据,使用 RRDtoo...

50180
来自专栏郭霖

Android数据库高手秘籍(一)——SQLite命令

要想熟练地操作任何一个数据库,最最基本的要求就是要懂SQL语言,这也是每个程序员都应该掌握的技能。虽说SQL博大精深,要想精通确实很难,但最基本的一些建表命令,...

222100
来自专栏cs

知识点找回2.0

Servlet(server Applet),全称Java Servlet, 是用java编写的服务器端程序。而这些Servlet都要实现Servlet的这个借...

9610

扫码关注云+社区

领取腾讯云代金券