私信我或关注微信号:猿来如此呀,回复:学习,获取免费学习资源包。

今天我们就从数据库的角度来思考一下 SQL 是如何被执行的。

关于今天的内容,你会从以下几个方面进行学习:

  1. Oracle 中的 SQL 是如何执行的,什么是硬解析和软解析;
  2. MySQL 中的 SQL 是如何执行的,MySQL 的体系结构又是怎样的;
  3. 什么是存储引擎,MySQL 的存储引擎都有哪些?

Oracle 中的 SQL 是如何执行的

我们先来看下 SQL 在 Oracle 中的执行过程:

从上面这张图中可以看出,SQL 语句在 Oracle 中经历了以下的几个步骤。

  1. 语法检查:检查 SQL 拼写是否正确,如果不正确,Oracle 会报语法错误。
  2. 语义检查:检查 SQL 中的访问对象是否存在。比如我们在写 SELECT 语句的时候,列名写错了,系统就会提示错误。语法检查和语义检查的作用是保证 SQL 语句没有错误。
  3. 权限检查:看用户是否具备访问该数据的权限。
  4. 共享池检查:共享池(Shared Pool)是一块内存池,最主要的作用是缓存 SQL 语句和该语句的执行计划。Oracle 通过检查共享池是否存在 SQL 语句的执行计划,来判断进行软解析,还是硬解析。那软解析和硬解析又该怎么理解呢?

在共享池中,Oracle 首先对 SQL 语句进行 Hash 运算,然后根据 Hash 值在库缓存(Library Cache)中查找,如果存在 SQL 语句的执行计划,就直接拿来执行,直接进入“执行器”的环节,这就是软解析。

如果没有找到 SQL 语句和执行计划,Oracle 就需要创建解析树进行解析,生成执行计划,进入“优化器”这个步骤,这就是硬解析。

  1. 优化器:优化器中就是要进行硬解析,也就是决定怎么做,比如创建解析树,生成执行计划。
  2. 执行器:当有了解析树和执行计划之后,就知道了 SQL 该怎么被执行,这样就可以在执行器中执行语句了。

共享池是 Oracle 中的术语,包括了库缓存,数据字典缓冲区等。我们上面已经讲到了库缓存区,它主要缓存 SQL 语句和执行计划。而数据字典缓冲区存储的是 Oracle 中的对象定义,比如表、视图、索引等对象。当对 SQL 语句进行解析的时候,如果需要相关的数据,会从数据字典缓冲区中提取。

库缓存这一个步骤,决定了 SQL 语句是否需要进行硬解析。为了提升 SQL 的执行效率,我们应该尽量避免硬解析,因为在 SQL 的执行过程中,创建解析树,生成执行计划是很消耗资源的。

你可能会问,如何避免硬解析,尽量使用软解析呢?在 Oracle 中,绑定变量是它的一大特色。绑定变量就是在 SQL 语句中使用变量,通过不同的变量取值来改变 SQL 的执行结果。这样做的好处是能提升软解析的可能性,不足之处在于可能会导致生成的执行计划不够优化,因此是否需要绑定变量还需要视情况而定。

举个例子,我们可以使用下面的查询语句:

SQL> select * from player where player_id = 10001;

你也可以使用绑定变量,如:

SQL> select * from player where player_id = :player_id;

这两个查询语句的效率在 Oracle 中是完全不同的。如果你在查询 player_id = 10001 之后,还会查询 10002、10003 之类的数据,那么每一次查询都会创建一个新的查询解析。而第二种方式使用了绑定变量,那么在第一次查询之后,在共享池中就会存在这类查询的执行计划,也就是软解析。

因此我们可以通过使用绑定变量来减少硬解析,减少 Oracle 的解析工作量。但是这种方式也有缺点,使用动态 SQL 的方式,因为参数不同,会导致 SQL 的执行效率不同,同时 SQL 优化也会比较困难。

MySQL 中的 SQL 是如何执行的

Oracle 中采用了共享池来判断 SQL 语句是否存在缓存和执行计划,通过这一步骤我们可以知道应该采用硬解析还是软解析。那么在 MySQL 中,SQL 是如何被执行的呢?

首先 MySQL 是典型的 C/S 架构,即 Client/Server 架构,服务器端程序使用的 mysqld。整体的 MySQL 流程如下图所示:

你能看到 MySQL 由三层组成:

  1. 连接层:客户端和服务器端建立连接,客户端发送 SQL 至服务器端;
  2. SQL 层:对 SQL 语句进行查询处理;
  3. 存储引擎层:与数据库文件打交道,负责数据的存储和读取。

其中 SQL 层与数据库文件的存储方式无关,我们来看下 SQL 层的结构:

  1. 查询缓存:Server 如果在查询缓存中发现了这条 SQL 语句,就会直接将结果返回给客户端;如果没有,就进入到解析器阶段。需要说明的是,因为查询缓存往往效率不高,所以在 MySQL8.0 之后就抛弃了这个功能。
  2. 解析器:在解析器中对 SQL 语句进行语法分析、语义分析。
  3. 优化器:在优化器中会确定 SQL 语句的执行路径,比如是根据全表检索,还是根据索引来检索等。
  4. 执行器:在执行之前需要判断该用户是否具备权限,如果具备权限就执行 SQL 查询并返回结果。在 MySQL8.0 以下的版本,如果设置了查询缓存,这时会将查询结果进行缓存。

你能看到 SQL 语句在 MySQL 中的流程是:SQL 语句→缓存查询→解析器→优化器→执行器。在一部分中,MySQL 和 Oracle 执行 SQL 的原理是一样的。

与 Oracle 不同的是,MySQL 的存储引擎采用了插件的形式,每个存储引擎都面向一种特定的数据库应用环境。同时开源的 MySQL 还允许开发人员设置自己的存储引擎,下面是一些常见的存储引擎:

  1. InnoDB 存储引擎:它是 MySQL 5.5 版本之后默认的存储引擎,最大的特点是支持事务、行级锁定、外键约束等。
  2. MyISAM 存储引擎:在 MySQL 5.5 版本之前是默认的存储引擎,不支持事务,也不支持外键,最大的特点是速度快,占用资源少。
  3. Memory 存储引擎:使用系统内存作为存储介质,以便得到更快的响应速度。不过如果 mysqld 进程崩溃,则会导致所有的数据丢失,因此我们只有当数据是临时的情况下才使用 Memory 存储引擎。
  4. NDB 存储引擎:也叫做 NDB Cluster 存储引擎,主要用于 MySQL Cluster 分布式集群环境,类似于 Oracle 的 RAC 集群。
  5. Archive 存储引擎:它有很好的压缩机制,用于文件归档,在请求写入时会进行压缩,所以也经常用来做仓库。

需要注意的是,数据库的设计在于表的设计,而在 MySQL 中每个表的设计都可以采用不同的存储引擎,我们可以根据实际的数据处理需要来选择存储引擎,这也是 MySQL 的强大之处。

数据库管理系统也是一种软件

我们刚才了解了 SQL 语句在 Oracle 和 MySQL 中的执行流程,实际上完整的 Oracle 和 MySQL 结构图要复杂得多:

如果你只是简单地把 MySQL 和 Oracle 看成数据库管理系统软件,从外部看难免会觉得“晦涩难懂”,毕竟组织结构太多了。我们在学习的时候,还需要具备抽象的能力,抓取最核心的部分:SQL 的执行原理。因为不同的 DBMS 的 SQL 的执行原理是相通的,只是在不同的软件中,各有各的实现路径。

既然一条 SQL 语句会经历不同的模块,那我们就来看下,在不同的模块中,SQL 执行所使用的资源(时间)是怎样的。下面我来教你如何在 MySQL 中对一条 SQL 语句的执行时间进行分析。

首先我们需要看下 profiling 是否开启,开启它可以让 MySQL 收集在 SQL 执行时所使用的资源情况,命令如下:

mysql> select @@profiling;

profiling=0 代表关闭,我们需要把 profiling 打开,即设置为 1:

mysql> set profiling=1;

然后我们执行一个 SQL 查询(你可以执行任何一个 SQL 查询):

mysql> select * from wucai.heros;

查看当前会话所产生的所有 profiles,你会发现我们刚才执行了两次查询,Query ID 分别为 1 和 2。如果我们想要获取上一次查询的执行时间,可以使用:

mysql> show profile;

当然你也可以查询指定的 Query ID,比如:

mysql> show profile for query 2;

查询 SQL 的执行时间结果和上面是一样的。

在 8.0 版本之后,MySQL 不再支持缓存的查询,原因我在上文已经说过。一旦数据表有更新,缓存都将清空,因此只有数据表是静态的时候,或者数据表很少发生变化时,使用缓存查询才有价值,否则如果数据表经常更新,反而增加了 SQL 的查询时间。

你可以使用 select version() 来查看 MySQL 的版本情况。

总结

我们在使用 SQL 的时候,往往只见树木,不见森林,不会注意到它在各种数据库软件中是如何执行的,今天我们从全貌的角度来理解这个问题。你能看到不同的 RDBMS 之间有相同的地方,也有不同的地方。

相同的地方在于 Oracle 和 MySQL 都是通过解析器→优化器→执行器这样的流程来执行 SQL 的。

但 Oracle 和 MySQL 在进行 SQL 的查询上面有软件实现层面的差异。Oracle 提出了共享池的概念,通过共享池来判断是进行软解析,还是硬解析。而在 MySQL 中,8.0 以后的版本不再支持查询缓存,而是直接执行解析器→优化器→执行器的流程,这一点从 MySQL 中的 show profile 里也能看到。同时 MySQL 的一大特色就是提供了各种存储引擎以供选择,不同的存储引擎有各自的使用场景,我们可以针对每张表选择适合的存储引擎。

今天的内容到这里就结束了,你能说一下 Oracle 中的绑定变量是什么吗?使用它有什么优缺点吗?MySQL 的存储引擎是一大特色,其中 MyISAM 和 InnoDB 都是常用的存储引擎,这两个搜索引擎的特性和使用场景分别是什么?

最后留一道选择题吧,解析后的 SQL 语句在 Oracle 的哪个区域中进行缓存?

A. 数据缓冲区

B. 日志缓冲区

C. 共享池

D. 大池

如果这篇文章帮你理顺了 Oracle 和 MySQL 执行 SQL 的过程,欢迎你把它分享给你的朋友或者同事。

来源网络,侵权联系删除

oracle execute immediate执行多条语句_用数据库的方式思考SQL是如何执行的相关推荐

  1. 数据库逻辑删除的sql语句_通过数据库的眼睛查询sql的逻辑流程

    数据库逻辑删除的sql语句 Structured Query Language (SQL) is famously known as the romance language of data. Eve ...

  2. java执行sql文件_面试官问你MyBatis SQL是如何执行的?把这篇文章甩给他

    初识 MyBatis MyBatis 是第一个支持自定义 SQL.存储过程和高级映射的类持久框架.MyBatis 消除了大部分 JDBC 的样板代码.手动设置参数以及检索结果.MyBatis 能够支持 ...

  3. oracle查看执行最慢与查询次数最多的sql语句及其执行速度很慢的问题分析

    oracle查看执行最慢与查询次数最多的sql语句 注:本文来源 于<oracle查看执行最慢与查询次数最多的sql语句> 前言 在ORACLE数据库应用调优中,一个SQL的执行次数/频率 ...

  4. oracle一条sql运行时间很长,oracle查看执行最慢与查询次数最多的sql语句及其执行速度很慢的问题分析...

    oracle查看执行最慢与查询次数最多的sql语句 前言 在ORACLE数据库应用调优中,一个SQL的执行次数/频率也是常常需要关注的,因为某个SQL执行太频繁,要么是由于应用设计有缺陷,需要在业务逻 ...

  5. jdbc preparestatement 执行多条语句_第二十一天JDBC编程

    JDBC编程 JDBC是连接数据库和Java程序的桥梁,通过JDBC API可以方便地实现对各种主流数据库的操作.本篇将介绍一下如何使用JDBC操作数据库(以MySQL为例). 一.JDBC JDBC ...

  6. oracle树子类遍历父类_不懂数据库索引的底层原理?那是因为你心里没点b树

    前几天下班回到家后正在处理一个白天没解决的bug,厕所突然传来对象的声音: 对象:xx,你有<时间简史>吗? 我:我去!妹子,你这啥癖好啊,我有时间也不会去捡屎啊! 对象:...人家说的是 ...

  7. rmi远程代码执行漏洞_【最新漏洞简讯】WebLogic远程代码执行漏洞 (CVE202014645)

    ↑ 点击上方"SecMind安全管家"关注我们 情报编号:W1120200715 漏洞概述 WebLogic是Oracle公司出品的用于开发.集成.部署和管理大型分布式Web应用. ...

  8. 执行transact mysql_创建数据库失败((Microsoft.SqlServer.Smo))执行Transact-SQL

    机房收费系统完成了,但是我是在笔记本上敲得,没有实现异地发布,结局只能是被PASS掉了~回来重新导出自己的数据库到台式机上,由于我笔记本装的SQL和台式机版本是不一样的,所以遇到一些问题,具体解决方法 ...

  9. mysql 查询执行过程_深入浅出Mysql(一)——sql查询执行过程

    一.sql查询执行过程概括 下面给出的mysql基本架构示意图,从中你可以清楚的mysql的各个模块和执行过程. 大体来说可以分为两部分Server层和储存引擎层.Server层包括连接器.查询缓存. ...

最新文章

  1. Bootstrap-table学习笔记(一)
  2. LNMP下目录访问验证
  3. java中path和classpath_java中的环境变量path和classpath的作用-Go语言中文社区
  4. 在Ubuntu上安装Sublime Text 3
  5. 揭秘苹果“地下黑工厂”:临时工薪资无保障,男厕所门口排长龙
  6. 让webstorm支持avalon语法自动补全
  7. 配置ssd为缓存_SSD小讲堂丨新电脑剪视频还卡?原因给你们找到了!
  8. 简单理解php的socket编程
  9. 赵栋 201771010137 《面向对象程序设计(java)》第二周学习总结
  10. oracle 9i,10G,11G,各版本下载资源(使用迅雷),收集好久,分享上来!
  11. GB28181协议--心跳
  12. 【Java】面向对象(二)继承
  13. Vision Transformer综述翻译
  14. Hz ms 频率 时间
  15. linux搭建虚拟化平台报告,Centos部署KVM虚拟化平台(可跟做)
  16. 以影像技术为“桨“,荣耀如何讲好高端“新故事”?
  17. 《风车》——仓央嘉措
  18. Excel 2010 VBA 入门 093 数据处理之建立数组
  19. 详解one-hot编码及代码举例
  20. 操作系统之文件管理(一)

热门文章

  1. SAP Fiori Elements - how drop down list with description is correctly rendered
  2. SAP BSP source code handling - how is native html source generated by UI framework
  3. SAP ABAP Netweaver和Hybris Commerce的开发license
  4. SAP CRM WebClient UI根据扩展字段搜索出结果的实现原理
  5. SAP UI5 OData binding - how does setModel work
  6. reuse project css less path folder hierarchy issue
  7. SAP Engagement Center的一段代码审查记录
  8. SAP CRM WebClient UI和CRM Fiori Account里显示Opportunity逻辑
  9. 写在Github被微软收购之际 - Github的那些另类用法
  10. animation基础练习源码_用vue简单写一个音乐播放组件「附源码」