【Oracle】硬解析、软解析和软软解析
前言
在Oracle中,每条SQL语句在执行之前都需要经过解析(Parse),根据解析的过程可以分为3种类型:硬解析(Hard Parse)、软解析(Soft Parse)和软软解析(Soft Soft Parse),软软解析也叫快速解析(Fast Parse)。DDL语句每次执行都需要进行硬解析,DML语句和SELECT语句会根据情况选择是进行硬解析,还是进行软解析或者进行软软解析。
判断硬解析和软解析的依据在于sga中的 share cursor 的缓存情况
判断软解析和软软解析的依据在于pga中的session cursor是否可以重用
相关阅读
SQL执行过程
客户端进程将SQL语句通过监听器发送到Oracle, 触发一个Server process生成,来对该客户进行服务。Server process得到SQL语句之后,对SQL语句进行Hash运算,然后根据Hash值先到当前会话的PGA中查找是否存在匹配的缓存会话游标(Session Cursor),如果PGA中不存在则到library cache中查找是否存在匹配的父游标(Parent Cursor)和子游标(Child Cursor),如果都不存在则重新开始解析目标SQL,选择最优执行计划,执行SQL并将结果返回给客户端。
硬解析
在当前会话的PGA中找不到匹配的缓存会话游标,在SGA的库缓存(Library Cache)中没有找到匹配的父游标或是找到了匹配的父游标没有找到对应子游标。那么oracle就会重新开始解析该目标SQL,那么Oracle就会新生成一个会话游标和一对共享游标(即父游标和子游标)解析目标SQL,这种方式我们称之为硬解析。
硬解析执行步骤
- 语法检查
- 权限与对象检查
- 优化器生成多个执行计划
- 选择最优的执行计划
- 将执行计划,SQL文本等装载进library cache中的heap中
软解析
在当前会话的PGA中找不到匹配的缓存会话游标,但在库缓存中找到了匹配的父游标和子游标,那么Oracle会新生成一个会话游标并重用刚刚找到的父游标和子游标,直接调用解析树和执行计划解析目标SQL,这种方式我们称之为软解析。
软软解析
在当前会话的PGA中找到了匹配的缓存会话游标,那么此时Oracle就不再需要新生成一个会话游标,并且也不再需要像软解析那样得去SGA的库缓存中查找匹配的父游标了,因为Oracle此时可以重用找到的匹配会话游标,并且可以通过这个会话游标直接访问到该SQL对应的父游标获取解析树和执行计划解析目标SQL,这种方式我们称之为软软解析。
软软解析的必要条件:
1. 参数session_cached_cursors的值是大于0
2. 同一个session中执行过三次以上目标SQL
优缺点
类型 | 硬解析 | 软解析 | 软软解析 |
---|---|---|---|
优缺点 | 硬解析可能会导致Shared Pool Latch争用,会消耗大量CPU资源以及SGA资源,OLTP系统硬解析是万恶之源 | 软解析也可能会导致库缓存相关Latch的争用,但持有次数少时间短 | 省去了Open一个新游标和Close一个现有会话游标消耗的资源和时间 |