今天在项目中探讨到Oracle对于SQL语句的解析方法以及MySQL相应的处理方法:

-----------------------------------------------------------------------------------------------------------

先来看一下Oracle的机制:

oralce中有硬解析和软解析的概念,为了能够理解好这两个概念,我们先引入oralce是怎么执行SQL的

oracle在执行SQL的时候有如下步骤:

1 语法检查,例如SQL的拼写

2 语义检查,例如sql中的对象是否存在及相关的权限

3 sql解析,对sql进行语法解析,生成解析树及执行计划

3.1 硬解析 包括语法和语义分析,查看共享池是否有解析好的结果,然后选择执行计划和生成执行计划,执行sql

3.2 软解析,如果在共享池中有解析好的结果,直接执行sql

创建解析树、生成执行计划对于sql的执行来说是开销昂贵的动作,所以,应当极力避免硬解析,尽量使用软解析。这就是在很多项目中,倡导开发设计人员对功能相同的代码要努力保持代码的一致性,以及要在程序中多使用绑定变量的原因。

3.3 其中查看共享池的部分涉及到利用sql的哈希值和共享池中的哈希值做比较,这些比较包括大小写,字符串一致性,空格,注释

4 执行sql

这里再插入一个绑定变量的概念

绑定变量简单点理解就是在sql语句中的参数的地方使用一个占位符

1 select from emp where empno=7788    --未使用绑定变量
2 select from emp where empono=:eno   --:eno即为绑定变量

减少 SQL 语句的硬解析,从而减少因硬解析产生的额外开销 ( CPU,Shared pool,latch) 。其次提高编程效率,减少数据库的访问次数。

另外,有一点要注意一下,DDL每次都是硬解析,dml会走软解析

-------------------------------------------------------------------------------------------------------------------------

MySQL没有全局sql字节码缓存,所有的语句都要解析成语法树,所以mysql不存在软硬解析的机制,

相对应的mysql的处理机制在下面最了详细的分析:.

1:先看MySQL整体模块图:

 
(图片取自MySQL核心技术) 
从图中可以看出MySQL的模块职责分工明确,不愧是Monty团队20年的结晶.好产品是靠持续的汗水浇灌的啊(扯远了)。。。 
其中MySQL语句大概分两种:SQL和命令

SQL无非就是DDL,DML,命令是mysql自身语法如:show [table,process,database,index] , source ...等等.

用一条DML为例,连接管理器模块,线程模块,权限模块职责很明确此处略.

第一步由Commander Dispatcher(命令)模块统一接受处理, 
1)如果开启全查询日志(是log 不是slow-low),会记录所有的语句(包括错误语句) 
2)如果开启查询缓存(query_cache_type=1)会先判断语句是否可缓存,如果可以使用语句和客户端信息等的hash值查询query cache模块 如果找到数据短路.

第二步将语句转交parser模块进行解析,并发送给不同模块(优化器,表修改模块,表维护模块,复制模块,状态模块等) 
其中最重要的是优化器模块,这个是所有数据库的核心,所有的DML都经过它完成 
(这个后面的文章做进一步总结和学习,sql的快与慢全靠他.)

第三步假如进入优化器模块:MySQL的优化器的只定义了抽象存储引擎(Handler) 
具体实现由存储引擎完成(mysql的插件引擎特性)

第四步进入存储引擎内部完成具体的数据读取和修改,内部有很复杂的处理流程和日志体系(如:innodb buffer_pool,redo,undb等..).

第五步返回数据,如果开启查询缓存会做尝试做缓存.最后完成清理工作,回收线程. 
这里非常粗粒度的介绍的MySQL模块见的相互配合完成sql的过程,具体流程比这复杂的多,正在看书并结合源码研究中。。 
简单语句流程到这里,MySQL下面看看另一张关注parser, optimizer的流程图 
 
(图片取自高性能MySQL)

这张图更能体现sql的一些解析处理和优化过程. 
这里有个问题需要介绍以下MySQL没有全局sql字节码缓存,所有的语句都要解析成语法树. 
如果使用PrepareStatement的机制发送SQL 则mysql只在当前session支持预编译 
官方解释如下: 
http://dev.mysql.com/doc/refman/5.1/en/sql-syntax-prepared-statements.html 
这里和Oracle由很大不同,也就是说你没有使用变量绑定,MySQL也不会像Oracle那样迅速被拖慢... 
mysql有SQL服务器模式,通过sql-mode参数体现. 
可以随时更改自己的会话 sql_mode值 
主要sql_mode取值如下: 
· ANSI: 
· STRICT_TRANS_TABLES: 
·TRADITIONAL 
·ALLOW_INVALID_DATES 
·ANSI_QUOTES 
·ERROR_FOR_DIVISION_BY_ZERO 
·HIGH_NOT_PRECEDENCE 
查看官方文档解释:http://dev.mysql.com/doc/refman/5.1/zh/database-administration.html#server-sql-mode 
你在mysql中遇到不一致的sql执行结果时,记得看看你session的sql_mode

关于ORACLE的硬解析和软解析与MySQL的查询缓存query_cache探讨的更多相关文章

  1. Oracle SQL的硬解析、软解析、软软解析

    Oracle中每条sql在执行前都要解析,解析分为硬解析.软解析.软软解析. Oracle会缓存DML语句,相同的DML语句会进行软解析.但不会缓存DDL语句,所以DDL每次都做硬解析.硬解析是一个很 ...

  2. Oracle的硬解析和软解析

    提到软解析(soft prase)和硬解析(hard prase),就不能不说一下Oracle对sql的处理过程.当你发出一条sql语句交付Oracle,在执行和获取结果前,Oracle对此sql将进 ...

  3. [转]ORACLE SQL解析之硬解析和软解析

    http://blog.chinaunix.net/uid-25909722-id-3363789.html 当客户端进程,将SQL语句通过监听器发送到Oracle时, 会触发一个Server pro ...

  4. Oracle硬解析,软解析,软软解析介绍

    Oracle数据库中的CURSOR分为两种类型:Shared Cursor 和 Session Cursor 1,Shared Cursor Oracle里的第一种类型的Cursor就是Shared ...

  5. PLSQL_解析过程及硬解析和软解析的区别(案例)

    2014-08-11 Created By BaoXinjian

  6. Oracle SQL的硬解析和软解析

    我们都知道在Oracle中每条SQL语句在执行之前都需要经过解析,这里面又分为软解析和硬解析.在Oracle中存在两种类型的SQL语句,一类为 DDL语句(数据定义语言),他们是从来不会共享使用的,也 ...

  7. 共享池之八:软解析、硬解析、软软解析 详解一条SQL在library cache中解析涉及的锁

    先来张大图: 结合上图来说明一下解析的各个步骤涉及的锁. 软解析.硬解析.软软解析区别的简单说明: 为了将用户写的sql文本转化为oracle认识的且可执行的语句,这个过程就叫做解析过程. 解析分为硬 ...

  8. SQL 软解析和硬解析详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt329 当客户端进程,将SQL语句通过监听器发送到Oracle时, 会触发一个 ...

  9. oracle 内存结构 share pool sql解析的过程

    1.sql解析的过程 oracle首先将SQL文本转化为ASCII字符,然后根据hash函数计算其对应的hash值(hash_value).根据计算出的hash值到library cache中找到对应 ...

随机推荐

  1. managedQuery和query的区别,

    我们都知道在Android系统中,SQLite数据库的相关操作方式被封装为内容提供Content Provider,可以帮助那些不会SQL语言的开发者快速实现Android平台上的数据库操作,但是平时 ...

  2. 转:Android 获取Root权限

    来自:http://blog.csdn.net/twoicewoo/article/details/7228940 import java.io.DataOutputStream; import an ...

  3. 前端自动化神器gulp使用记录

    1.安装压缩图片插件的时候,由于网络原因,死活安装不成功.由于imagemin本身就包含很多插件,安装的时候卡住了,很是郁闷.如果要压缩png图片,那就单独安装imagemin-pngquant压缩插 ...

  4. python小问题记录:

    numpy.chararray.flatten chararray.flatten(order='C') Return a copy of the array collapsed into one d ...

  5. mysql 插入汉字 异常 Incorrect string value: '\xE8\xA7\x84\xE5\x88\x99' for column 'name'

    今天使用mysql出现 Incorrect string value: '\xE8\xA7\x84\xE5\x88\x99' for column 'name' 异常 通过查找问题,发现是字段编码不支 ...

  6. abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?

    abstract的method不可以是static的,因为抽象的方法是要被子类实现的,而static与子类扯不上关系! native方法表示该方法要用另外一种依赖平台的编程语言实现的,不存在着被子类实 ...

  7. Sciter/HTMLayout内存占用评测

    先从最基础的Exe文件的执行说起: Exe文件要在系统中执行,首先要将Exe文件本身加载入内存中,并且通常在内存中加载完成的Exe所占空间大小会比实际所占的磁盘空间大一些,这是由内存的特殊设定所决定的 ...

  8. Android Dialog使用举例

    在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框,在我们使用Android的过程中,我归纳了一 ...

  9. 利用nginx+lua+memcache实现灰度发布

    一.灰度发布原理说明 灰度发布在百度百科中解释: 灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式.AB test就是一种灰度发布方式,让一部分用户继续用A,一部分用户开始用B,如果用户对B没有什 ...

  10. MySQL基础之第4章 MySQL数据类型

    4.1.整数类型 tinyint(4)smallint(6)mediumint(9)int(11)bigint(20) 注意:后面的是默认显示宽度,以int为例,占用的存储字节数是4个,即4*8=32 ...