网站首页 > 技术文章 正文
概述
TOM大叔的调优书中说过一句话,大概意思就是:如果有人让我写本怎样让ORACLE性能最慢的书的话我会将取消绑定变量(bind variable)做为书的第一章和最后一章,可见绑定变量的重要性。而绑定变量影响的实际上就是Oracle数据库的硬解析和软解析了。
Oracle数据库硬解析和软解析有相同的一步,而软软解析与硬解析、软解析完全不一样。
一、sql解析
这里我们先简单sql语句执行步骤:
1.语法检查(syntax check)
2.语义检查(symantic check): 对象是否存在,是否有权限。
3.sql解析(parse): 利用内部算法对sql进行解析,生成解析树及执行计划。
4.执行sql,返回结果(execute and return)
首先了解一下sql解析时用到的内存结构——shared pool:
shared pool是一块内存池,里边又被分成了很多小的区块,每个块有他们的作用
1.free (空闲) 2.library cache (库缓存,缓存sql语句以及sql所对应的执行计划) 3.row cache (字典缓存——库里有多少表,多少用户,多少个列,列的名字,列的数据类型,每个表多大等等都属于数据库自身信息。)
一个sql 语句,进入到数据库后,server process 会拿着sql语句到shared pool中的library cache 里边去找,看sql语句以前是否有执行过。也就是在library cache 里面看有没有这条sql语句以及sql语句所对应的执行计划。(此过程是通过对传递进来的SQL语句使用HASH函数运算得出HASH值,与共享池中现有语句的HASH值进行比较看是否一一对应。现有数据库中SQL语句的HASH值我们可以通过访问vsql、vsql、vsqlarea、v$sqltext等数据字典中的HASH_VALUE列查询得出。)
二、涉及解析的概念
1、硬解析
硬解析(Hard Parse)是指Oracle在执行目标SQL时,在库缓存(Library Cache)中找不到可以重用的解析树和执行计划,而不得不从头开始解析目标SQL并生成相应的父游标(Parent Cursor)和子游标(Child Cursor)的过程。
硬解析实际上有两种类型:一种是在库缓存中找不到匹配的父游标(Parent Cursor),此时Oracle会从头开始解析目标SQL,新生成一个父游标和一个子游标,并把它们挂在对应的HashBucket中;另外一种是找到了匹配的父游标但未找到匹配的子游标,此时Oracle也会从头开始解析该目标SQL,新生成一个子游标,并把这个子游标挂在对应的父游标下。
硬解析过程:
- 1.语法、语义及权限检查;
- 2.查询转换(通过应用各种不同的转换技巧,会生成语义上等同的新的SQL语句,如count(1)会转为count(*));
- 3.根据统计信息生成执行计划(找出成本最低的路径,这一步比较耗时);
- 4.将游标信息(执行计划)保存到库缓存。
2、软解析
软解析(Soft Parse)是指Oracle在执行目标SQL时,在Library Cache中找到了匹配的父游标(Parent Cursor)和子游标(Child Cursor),并将存储在子游标中的解析树和执行计划直接拿过来重用而无须从头开始解析的过程。
软解析过程:
- 1.语法、语义及权限检查;
- 2.将整条SQL hash后从库缓存中执行计划。
软解析对比硬解析省了三个步骤。
3、软软解析
软软解析(Soft Soft Parse)是指若参数SESSION_CACHED_CURSORS的值大于0,并且该会话游标所对应的目标SQL解析和执行的次数超过3次,则此时该会话游标会被直接缓存在当前会话的PGA中的。若该SQL再次执行的时候,则只需要对其进行语法分析、权限对象分析之后就可以直接从当前会话的PGA中将之前缓存的匹配会话游标直接拿过来用就可以了,这就是软软解析。
软软解析过程:
要完全理解软软解析先要理解游标的概念,当执行SQL时,首先要打开游标,执行完成后,要关闭游标,游标可以理解为SQL语句的一个句柄。
在执行软软解析之前,首先要进行软解析,MOS上说执行3次的SQL语句会把游标缓存到PGA,这个游标一直开着,当再有相同的SQL执行时,则跳过解析的所有过程直接去取执行计划。
三、实验:
1、环境准备:
drop table test purge; alter system flush shared_pool; create table test as select * from dba_objects where 1<>1; exec dbms_stats.gather_table_stats(ownname => 'sys',tabname => 'test');
2、硬解析
select * from test where object_id=20; select * from test where object_id=30; select * from test where object_id=40; select * from test where object_id=50;
3、软解析
var oid number; exec :oid:=20; select * from test where object_id=:oid; exec :oid:=30; select * from test where object_id=:oid; exec :oid:=40; select * from test where object_id=:oid; exec :oid:=50; select * from test where object_id=:oid;
4、软软解析
begin for i in 1..4 loop execute immediate 'select * from test where object_id=:i' using i; end loop; end; /
5、统计
select sql_text,s.PARSE_CALLS,loads,executions from v$sql s where sql_text like 'select * from test where object_id%' order by 1,2,3,4;
可以看到软解析与软软解析相比,软软解析只是解析一次。
字段解释:
- PARSE_CALLS 解析的次数
- LOADS 硬解析的次数
- EXECUTIONS 执行的次数
觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~
猜你喜欢
- 2024-10-15 详解Oracle 性能优化之内核的shmall、shmmax和信号灯参数
- 2024-10-15 Oracle基础知识杂谈 oracle的
- 2024-10-15 ORACLE不常用冷知识之Package oracle中package怎么执行的
- 2024-10-15 使用zabbix监控Oracle内存占用高 oracle占用内存过高
- 2024-10-15 Oracle HugePage在生产环境中的使用
- 2024-10-15 记一次Oracle异常关闭资源没有被释放,导致无法正常重启的故障
- 2024-10-15 oracle性能调优-impdp导入加速 oracle19c impdp
- 2024-10-15 oracle实例是什么 oracle实例是什么 lisener
- 2024-10-15 十个最流行的Oracle性能指标,DBA必知
- 2024-10-15 只需3分钟,学会Oracle数据库自动SGA管理
你 发表评论:
欢迎- 最近发表
-
- 前端流行框架Vue3教程:13. 组件传递数据_Props
- 前端必看!10 个 Vue3 救命技巧,解决你 90% 的开发难题?
- JAVA和JavaScript到底是什么关系?是亲戚吗?
- Java和js有什么区别?(java和javascript的区别和联系)
- 东方标准|Web和Java的区别,如何选择这两个专业
- 前端面试题-JS 中如何实现大对象深度对比
- 360前端一面~面试题解析(360前端笔试)
- 加班秃头别慌!1 道 Vue 面试题,快速解锁大厂 offer 通关密码
- 焦虑深夜刷题!5 道高频 React 面试题,吃透 offer 稳了
- 2025Web前端面试题大全(整理版)面试题附答案详解,最全面详细
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端md5加密 (49)
- 前端路由 (55)
- 前端数组 (65)
- 前端定时器 (47)
- 前端懒加载 (45)
- 前端接口 (46)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle查询数据库 (45)
- oracle约束 (46)
- oracle 中文 (51)
- oracle链接 (47)
- oracle的函数 (57)
- mac oracle (47)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)