1、Oracle中SQL语句是怎么执行的,什么是硬解析,什么是软解析?
Oracle中SQL语句的执行过程:
1)语法检查:检查SQL拼写是否正确,如果不正确,Oracle会报语法错误。
2)语义检查:检查SQL中的访问对象是否存在。比如我们在写Select语句的时候,如果列名写错了,系统就会提示有错误。语法检查和语义检查的作用就是保证我们的SQL语句没有错误。
3)权限检查:看用户是否具有访问该数据库的权限。
4)共享池检查:共享池(shared pool)是一块内存池,最主要的作用是缓存SQL语句和该语句的执行计划。Oracle通过检查共享池是否存在SQL语句的执行计划来判断进行软解析还是硬解析。
在共享池中,Oracle首先对SQL语句进行Hash运算,然后根据Hash值在库缓存(Library Cache)中查找,如果存在SQL语句的执行计划,就直接拿来执行,直接进入“执行器”的环节,这就是软解析。
如果没有找到SQL语句和执行计划,Oracle就需要创建解析树进行解析,生成执行计划,进入“优化器”这个步骤,这就是硬解析。
5)优化器:优化器就是要进行硬解析,也就是决定怎么做,比如:创建解析树,生成执行计划。
6)执行器:当有了解析树和执行计划,就知道了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优化也会比较困难。
2、MySql中SQL语句是怎么执行的,MySql的体系结构又是怎么样的?
在 MySQL 中,SQL 执行过程:
首先,MySql是典型的C/S架构,服务端程序使用的mysqlId,整体的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的原理是一样的。
3、什么是存储引擎,MySql的存储引擎有哪些?
与Oracle不同的是,MySql的存储引擎采用了插件的形式,每个存储引擎都面向一种特定的数据库应用环境。同时开源的MySql还允许开发人员设置自己的存储引擎,下面是一些常见的存储引擎:
1)InnoDB 存储引擎:它是MySQL 5.5.8 版本之后默认的存储引擎,最大的特点是支持事务、行级锁定、外键约束等。
2)MyISAM 存储引擎:在 MySQL 5.5.8 版本之前是默认的存储引擎,不支持事务、也不支持外键。最大的特点是速度快,占用资源少。
3)Memory存储引擎:使用系统内存作为存储介质,以便得到更快的相应速度。不过如果mysqlId进程崩溃,则会导致所有的数据丢失,因此我们只有当数据是临时情况下才使用Memory存储引擎。
4)NDB存储引擎:也叫做NDB Cluster存储引擎,主要用于MySql Cluster分布式集群环境,类似于Oracle的RAC集群。
5)Archive存储引擎:他又很好的压缩机制,用于文件归档,在请求写入时会进行压缩,所以也经常用来做仓库。
4、总结: