所述内容均来自互联网,文章仅作为学习笔记,备忘使用。

  有时候我在想我们总是在谈优化,FA 优化结构、优化框架、优化程序…,可是我真的了解将要进行的操作[优化]吗?以最近我的工作-优化SQL为例,我真的明白一条SQL从提交服务器到返回数据所经理的过程吗?貌似这些理论知识以前都看过,但年代久远在我的记忆中已经变的相当模糊。现在重新来认识一下:

查询解析:

  当服务器接收到请求,获取到需要当前需要执行的字符串[SQL语句],首先会对其进行解析,看看是否符合基本的语法结构,如果没有问题,将继续进行后续步骤,反之则给出响应的错误提示。当然如果是DDL语句就不用再看了,SQL不会对DDL进行优化。

深度查询解析:

  看网上的大牛称这步为Algebrizer,为了方便本人记忆我称之为深度解析,它完成一些基本但更深入的评估工作,例如对方是否存在等等。如果没有发现问题,Algebrizer 输出一个二进制数据称为查询处理树,并传输给查询优化器。查询处理树包含了一个Hash值(描述查询的一个已经编码的值)。优化器根据这个Hash值去确认当前的查询计划是否存在,如果当发现已经存在,优化过程将在这里结束并使用这个计划。查询计划是什么呢?其实我们经常见到,就是平时不太注意,我们有两种方式来查看查询计划:图表、列表

 SET STATISTICS PROFILE ON
SELECT d.name FROM HumanResources.Department AS D WHERE d.DepartmentID=42
这样就可以看到表格形式的查询计划了。

  

查询优化:

  优化器本质是一块模型,用于模拟数据库关系引擎如何工作的软件。统计信息是核心,它是由SQLServer针对索引和列产生并维护的,明确用于优化的组件。需要注意的是表变量没有统计信息而临时表拥有和物理表一样的统计信息。通过查询处理树和关于数据的统计信息,优化器应用模型将给出它认为最佳的查询的方式,也就是说,它产生一个执行计划。优化器会产生并评估很多计划并缓存计划[存放在名为plan cache的内存中],通常来说,SQL会选择开销最低的计划,也就是它认为的最优计划,多数情况下SQL的选择都是正确的。有时候,优化优化器执行的并不是最好的执行计划,而是找到最少可能的迭代次数的最低开销的计划,也就是说找到在处理过程中最短时间的计划,当然有时候也会执行一个并不很好的计划。

查询执行:

  当上面的步骤都已经完成,计划已经制定,那就要开始干活了,这个时候将由分析引擎切换到存储引擎。由它来完成整个查询计划的实施过程。一般来说这个步骤是整个请求响应的最后一步。但也不是一定的,特定的情况下查询计划会发生更改,从而回到查询计划的评估和制定步骤,例如统计信息发生了变化、查询中使用了临时表等。

            SQL的执行顺序

SQL 查询的执行过程的更多相关文章

  1. SQL嵌套子查询和相关子查询的执行过程有什么区别(推荐)

    SQLServer子查询可以分为 相关子查询 和 嵌套子查询 两类.前提, 假设Books表如下: 类编号 图书名 出版社 价格 ----------------------------------- ...

  2. ORACLE数据库SQL语句的执行过程

    SQL语句在数据库中处理过程是怎样的呢?执行顺序呢?在回答这个问题前,我们先来回顾一下:在ORACLE数据库系统架构下,SQL语句由用户进程产生,然后传到相对应的服务端进程,之后由服务器进程执行该SQ ...

  3. 小觑数据库(SqlServer)查询语句执行过程

    近年来,越来越多的NoSql产品不断的以技术革命的者的身份跳出来:“你看哥是多么的快,你们关型型数据库真是战五渣阿”.是的,高性能的场景下NoSql真的很出彩.而我们关系型数据库只能在墙角哭泣&quo ...

  4. MySQL查询语句执行过程及性能优化(JOIN/ORDER BY)-图

    http://blog.csdn.net/iefreer/article/details/12622097 MySQL查询语句执行过程及性能优化-查询过程及优化方法(JOIN/ORDER BY) 标签 ...

  5. MySQL查询语句执行过程及性能优化-查询过程及优化方法(JOIN/ORDER BY)

    在上一篇文章MySQL查询语句执行过程及性能优化-基本概念和EXPLAIN语句简介中介绍了EXPLAIN语句,并举了一个慢查询例子:

  6. spring MVC +freemarker + easyui 实现sql查询和执行小工具总结

    项目中,有时候线下不能方便的连接项目中的数据源时刻,大部分的问题定位和处理都会存在难度,有时候,一个小工具就能实时的查询和执行当前对应的数据源的库.下面,就本人在项目中实际开发使用的小工具,实时的介绍 ...

  7. [转]MySQL查询语句执行过程详解

    Mysql查询语句执行原理 数据库查询语句如何执行?语法分析:首先进行语法分析,对使用sql表示的查询进行语法分析,生成查询语法分析树.语义检查:检查sql中所涉及的对象以及是否在数据库中存在,用户是 ...

  8. Mysql查询语句执行过程

    Mysql查询语句执行过程   Mysql分为server层和存储引擎两部分,或许可以再加一层连接层   连接层(器) Mysql使用的是典型的C/S架构.连接器通过典型的TCP握手完成连接. 需要注 ...

  9. SQL查询语句执行流程

    msyql执行流程 你有个最简单的表,表里只有一个 ID 字段,在执行下面这个查询语句时:: select * from T where ID=10: 我们看到的只是输入一条语句,返回一个结果,却不知 ...

随机推荐

  1. Flesch Reading Ease(模拟)

    http://poj.org/problem?id=3371 终于遇到简单一点的模拟题了.不过本人真心没有耐心读题目... 它的大致意思就是给一段合法的文章,求出这段文章的单词数,句子数,音节数,按照 ...

  2. poj2228

    这显然是一道环形dp的题目 处理环形我们都是要转化为线性来做 一般有这么两种方法处理 复制一段到最后 (比如说noip的能量项链) 考查环形对dp的影响然后分类讨论(比如bzoj1040) 这道题我们 ...

  3. 【Gzip】

    为你的网站开启 gzip 压缩功能(nodejs.nginx) Do not forget to use Gzip for Express.js 网页GZIP压缩检测

  4. Linux Shell编程(3)——运行shell脚本

    写完一个脚本,你能够运行它用命令:sh scriptname, [5] 另外也也可以用bash scriptname. 来执行(不推荐使用:sh <scriptname, 因为这样会禁止脚本从标 ...

  5. 嵌入式 linux 查看内存

    在Windows系统中查看内存的使用情况很简单,想必大家都已经耳熟能详了,那么在linux系统如何查看内存使用情况呢?下面和大家分享在Linux下查看内存使用情况的free命令: [root@scs- ...

  6. CGI编程完全手册

    一.基本原理 CGI:通用网关接口(Common Gateway Interface)是一个Web服务器主机提供信息服务的标准接口.通过CGI接口,Web服务器就能够获取客户端提交的信息,转交给服务器 ...

  7. 【最大流】ECNA 2015 F Transportation Delegation (Codeforces GYM 100825)

    题目链接: http://codeforces.com/gym/100825 题目大意: N(N<=600)个点,每个点有个名字Si,R(R<=200)个生产商在R个点上,F(F<= ...

  8. 福州大学 Problem 2169 shadow

    http://acm.fzu.edu.cn/problem.php?pid=2169 思路:建立一个邻接表,利用搜索中回溯把走过的路标记为1,然后把这些标记为1的值全部加起来. Problem 216 ...

  9. bzoj 1010 [HNOI2008]玩具装箱toy(DP的斜率优化)

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 7874  Solved: 3047[Submit][St ...

  10. Java nextInt()函数

    nextInt( int num) 能接受一个整数作为它所产生的随机整数的上限,下限为零,比如:nextInt(4)将产生0,1,2,3这4个数字中的任何一个数字,注意这里不是0-4,而是0-3..但 ...