当客户端进程,将SQL语句通过监听器发送到Oracle时, 会触发一个Server process生成,来对该客户进程服务。Server process得到SQL语句之后,对SQL语句进行Hash运算,然后根据Hash值到library cache中查找,如果存在,则直接将library cache中的缓存的执行计划拿来执行,最后将执行结果返回该客户端,这种SQL解析叫做软解析;如果不存在,则会对该SQL进行解析parse,然后执行,返回结果,这种SQL解析叫做硬解析。

1.硬解析的步骤

硬解析一般包括下面几个过程:

1)对SQL语句进行语法检查,看是否有语法错误。比如select from where 等的拼写错误,如果存在语法错误,则推出解析过程;

2)通过数据字典(row cache),检查SQL语句中涉及的对象和列是否存在。如果不存在,则推出解析过程。

3)检查SQL语句的用户是否对涉及到的对象是否有权限。如果没有则推出解析;

4)通过优化器创建一个最优的执行计划。这个过程会根据数据字典中的对象的统计信息,来计算多个执行计划的cost,从而得到一个最优的执行计划。这一步涉及到大量的数据运算,从而会消耗大量的CPU资源;(library cache最主要的目的就是通过软解析来减少这个步骤);

5)将该游标所产生的执行计划,SQL文本等装载进library cache中的heap中。

2.软解析

所谓软解析,就是因为相同文本的SQL语句存在于library cache中,所以本次SQL语句的解析就可以去掉硬解析中的一个活多个步骤。从而节省大量的资源的耗费。

3.软软解析

所谓的软软解析,就是不解析。当设置了session_cached_cursors参数时,当某个session第三次执行相同的SQL语句时,则会把该SQL语句的游标信息转移到该session的PGA中。这样,当该session在执行该SQL语句时,会直接从PGA中取出执行计划,从而跳过硬解析的所有步骤。

SQL> show parameter cursor;

NAME                                 TYPE        VALUE

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

cursor_sharing                       string      EXACT

cursor_space_for_time                boolean     FALSE

open_cursors                         integer     300

session_cached_cursors               integer     20

open_cursors设定每个session(会话)最多能够同时打开多少个cursors(游标)。

================================================

摘自:http://www.itpub.net/thread-796685-1-1.html

SESSION_CACHED_CURSORS的值就是说的是一个session可以缓存多少个cursor,让后续相同的SQL语句不再打开游标,从而避免软解析的过程来提高性能。(绑定变量是解决硬解析的问题),软解析同硬解析一样,比较消耗资源.所以这个参数非常重要。

oracle有一个概念,那就是session cursor cache,中文描述就是有一块内存区域,用来存储关闭了的cursor。当一个cursor关闭之后,oracle会检查这个cursor的request次数是否超过3次,如果超过了三次,就会放入session cursor cache,这样在下次parse的时候,就可以从session cursor cache中找到这个statement, session cursor cache的管理也是使用LRU。

session_cached_cursors这个参数是控制session cursor cache的大小的。session_cached_cursors定义了session cursor cache中存储的cursor的个数。这个值越大,则会消耗的内存越多。

另外检查这个参数是否设置的合理,可以从两个statistic来检查。

SQL> select name,value from v$sysstat where name like '%cursor%';

NAME VALUE

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

opened cursors cumulative 16439

opened cursors current 55

session cursor cache hits 8944

session cursor cache count 101

cursor authentications 353

SQL> select name,value from v$sysstat where name like '%parse%';

NAME VALUE

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

parse time cpu 0

parse time elapsed 0

parse count (total) 17211

parse count (hard) 1128

parse count (failures) 2

parse count(total)就是总的parse次数中,session cursor cache hits就是在session cursor cache中找到的次数,所占比例越高,性能越好。如果比例比较低,并且有剩余内存的话,可以考虑加大该参数。

Oracle 9i及以前,该参数缺省是0,10G上缺省是20。

mysql硬解析与软解析_SQL 软解析和硬解析详解相关推荐

  1. JS/JavaScript中解析JSON --- JSON.parse()、JSON.stringify()以及$.parseJSON()使用详解

    JS/JavaScript中解析JSON --- JSON.parse().JSON.stringify()以及$.parseJSON()使用详解 现在JSON格式在web开发中非常重要,特别是在使用 ...

  2. md0和md1linux软raid,linux下Raid及mdadm命令详解

    linux下Raid及mdadm命令详解 1.RAID级别:仅代表磁盘组织方式不同,没有高低之分: Raid常用种类:raid0,raid1,raid5,raid10,raid01 jbod:叠加硬盘 ...

  3. 【dubbo源码解析】 --- dubbo spi 机制(@SPI、@Adaptive)详解

    本文对应源码地址:https://github.com/nieandsun/dubbo-study 注意:dubbo 要求SPI扩展点的实现类必须要有一个无参构造,除了Wrapper实现类之外 文章目 ...

  4. C语言指针面试题解析(万字超多题,每题都有详解)

    目录 零.前言 1.整型数组 2.字符数组 1.strlen函数 2.arr[]={'a','b','c'....}型 1.sizeof()计算 2.strlen()计算 3.char arr[]=& ...

  5. MySQL基础篇(04):存储过程和视图,用法和特性详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.存储过程 1.概念简介 存储程序是被存储在服务器中的组合SQL语句,经编译创建并保存在数据库中,用户可通过存储过程的名字调用执行.存储过程 ...

  6. 如何快速掌握MYSQL?附牛客网精选的50道SQL题目详解【入门推荐】

    大家早上好,本人姓吴,如果觉得文章写得还行的话也可以叫我吴老师.欢迎大家跟我一起走进数据分析的世界,一起学习! 感兴趣的朋友可以关注我的数据分析专栏,里面有许多优质的文章跟大家分享哦. 另外也欢迎大家 ...

  7. mysql 点赞数据库设计_基于redis实现的点赞功能设计思路详解

    点赞其实是一个很有意思的功能.基本的设计思路有大致两种, 一种自然是用mysql等 数据库直接落地存储, 另外一种就是利用点赞的业务特征来扔到redis(或memcache)中, 然后离线刷回mysq ...

  8. mysql数据库的字符串表示什么意思_MySQL数据库的字符串类型详解(01)

    Mysql的数据类型主要分为三类:数字类型.字符串(字符)类型.日期和时间类型,由于时间紧迫,根据学习的需要 数字类型暂不做详解,等待有时间了在修改此文档,此文主要介绍mysql 数据类型中的字符串类 ...

  9. mysql group by having count_mysql中count(), group by, order by使用详解

    最近做IM的时候遇到一个问题,同时用到了这三个关键字.就是查询一个人的离线消息详情,我们服务端返回给客户端显示的这个详情包括了三个内容,第一个要求列出离线这段时间哪些人或者群给你发了消息,第二个这其中 ...

  10. mysql通过集合查询_MySQL使用集合函数进行查询操作实例详解

    本文实例讲述了MySQL使用集合函数进行查询操作.分享给大家供大家参考,具体如下: COUNT函数 SELECT COUNT(*) AS cust_num from customers; SELECT ...

最新文章

  1. java 操作 redis_java操作Redis
  2. 从零開始学androidlt;SeekBar滑动组件.二十二.gt;
  3. Java进阶之深入理解JVM类加载机制
  4. python爬虫今日头条街拍美图开发背景_分析Ajax请求并抓取今日头条街拍美图:爬取详情页的url与实际页面上显示不符...
  5. ubuntu下载百度网盘文件油猴+aria2
  6. 2020年上半年美团夜宵指数发展报告
  7. python按照日期筛选数据_Pandas日期数据处理:如何按日期筛选、显示及统计数据...
  8. rabbitmq可靠性投递_RabbitMQ 可靠投递
  9. 使用 Python 实现多进程
  10. 第九次作业(杨辉三角)
  11. R语言模拟:Bias Variance Decomposition
  12. Assembly初识
  13. MySQL 高阶语句
  14. 漫画:什么是 B+ 树?
  15. jsp之${CTX}理解
  16. 16. Segmentation
  17. Button控件更改背景和去掉边框
  18. SQL经典50查询语句(面试题)案例2
  19. 大学开学初计算机水平测试,请查收这份大学生开学攻略——
  20. Windows Terminal 关闭声音/提示音/table提示音

热门文章

  1. HTML5中input标签有用的新属性
  2. MySQL知识树 集合操作
  3. e.target 和 e.srcElement 的使用问题
  4. 为什么叫C++而不叫++C ?
  5. 用SSAS将多个FLV和MP3合成一个FLV文件
  6. matlab abc to dq0仿真,逆变器负载论文,关于基于同步旋转坐标的三相逆变器控制系统仿真相关参考文献资料-免费论文范文...
  7. 利尔达e95蓝牙模块程序_Arduino使用HC05蓝牙模块与手机连接
  8. Python使用标准库urllib模拟浏览器爬取网页内容
  9. DBMS连接不上 —— 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。
  10. 使用U盘驱动器安装Linux,使用U盘安装Ubuntu的详细图文教程