硬解析、软解析和软软解析
前言
在 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 一个现有会话游标消耗的资源和时间 |