阅读目录

  • 一、SQL Server组成部分
  • 二、查询的底层原理

本系列【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

转载于:https://www.cnblogs.com/yachao1120/p/9888943.html

理解SQL查询的底层原理相关推荐

  1. dotTrace 6.1帮你理解SQL查询如何影响应用性能

    dotTrace是JetBrains公司旗下的一款.NET应用程序性能瓶颈检测工具.该工具是ReSharper旗舰版的一部分,也可以单独安装.近日,dotTrace 6.1发布,主要增加了人们期待已久 ...

  2. 【图文详解:索引极简教程】极致 SQL 查询性能优化原理

    简介 在一本厚厚的书籍的前几页,通常会有几页目录.作用是让读者可以快速找到感兴趣的章节进行阅读. 目录之所以可以快速阅读,是因为它提前进行了结构化+有序处理. 同样的道理,数据库的数据表的文件下面(以 ...

  3. SQL group by底层原理——本质是排序,可以利用索引事先排好序

    转自:http://blog.csdn.net/caomiao2006/article/details/52140993 由于GROUP BY 实际上也同样会进行排序操作,而且与ORDER BY 相比 ...

  4. mysql 左外连接原理_深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接...

    1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和 ...

  5. 【MySQL进阶】MySQL事务隔离与锁机制底层原理万字总结(建议收藏!!)

    [MySQL进阶]MySQL事务隔离与锁机制底层原理万字总结(建议收藏!!) 参考资料: 美团技术团队:Innodb中事务隔离级别和锁的关系 数据库的锁,到底锁的是什么? 阿里面试:说说一致性读实现原 ...

  6. 底层原理有那么重要吗?

    大家好,我是贺同学. 前段时间在工作业务中碰到一个技术问题, 在发现问题,思考问题,解决问题的过程中,突然对底层原理有了一些思考,这里分享一下给大家. 背景 在业务中使用到了 Redis 数据库来存储 ...

  7. 作为程序员,对于底层原理真的有那么重要吗?

    前段时间在工作业务中碰到一个技术问题, 在发现问题,思考问题,解决问题的过程中,突然对底层原理有了一些思考,这里分享一下给大家. ​背景 在业务中使用到了 Redis 数据库来存储数据,但是在存储大数 ...

  8. bs架构与cs架构的区别_Oracle vs Mysql--架构、sql查询执行流程及SQL解析顺序区别说明...

    概述 之前分享的主要是Oracle上的一些内容,那么mysql又有哪些地方不一样呢?下面从MySQL总体架构.sql查询执行流程和语句执行顺序来看一下.. 01 架构总览 下面看一下mysql的架构图 ...

  9. 15个初学者必看的基础SQL查询语句

    1.创建表和数据插入SQL 我们在开始创建数据表和向表中插入演示数据之前,我想给大家解释一下实时数据表的设计理念,这样也许能帮助大家能更好的理解SQL查询. 在数据库设计中,有一条非常重要的规则就是要 ...

最新文章

  1. 计算机网络-物理层设备
  2. java局域网 端口扫描_java 如何端口扫描出ssh端口?
  3. Protocol Buffer入门——轻松搭建java环境 .
  4. mybatis分页插件PageHelper简单应用
  5. leetcode 376. Wiggle Subsequence | 376. 摆动序列(动态规划)
  6. 如何把一个float存到一个长度为4的char数组中?
  7. java println 数组_java 数组输出
  8. C 库函数 - pow()
  9. Java集合之LinkedList常见实例操作,实例说明
  10. [Leetcode] Path Sum II路径和
  11. python就业班讲义_64G 最新 Python 就业班 视频教程 全集 含 pdf 源码 资料
  12. 解码.NET 2.0配置之谜(一)
  13. 深度学习:基本概要:监督,无监督,半监督,弱监督,多示例,迁移学习
  14. 激光雷达--C16镭神16线三维激光雷达介绍
  15. 条形码类型和标准指南:一维、二维条码符号
  16. win10开机无响应 无服务器,win10开机假死-状态栏和开始菜单无响应
  17. 软件测试-面试题(基础+性能)
  18. 补充:混淆矩阵、图像分割指标计算
  19. Eclipse Neon EGit Integration gives Exception 401 Authorization Required
  20. 用命令提示符打开资源管理器目录

热门文章

  1. 测试学习篇——根据性能需求评估并发用户数
  2. 浏览器安装查看UE图的插件(Axure RP)
  3. jquery vue 替代_关于 top 工具的 6 个替代方案
  4. dom(一)——获取文本内容的方法
  5. java生成与解析二维码 支持插入图片与文字
  6. 零基础如何学好python爬虫?python爬取B站小视频
  7. 使用PropertyInfo类得到对象属性及值
  8. 关于12306的一些想法
  9. java滑块_Java Swing JSlider滑块的实现示例
  10. 微信/QQ/TIM防撤回神器,看见没有,这就是撤回狗