1、SHARED CURSOR (位于SGA)
PARENT CURSOR 只对应SQL文本(V$SQLAREA 不同SCHEMA下相同的SQL ,PARENT CURSOR也相同)
CHILD CURSOR 对应 VERSION COUNT (V$SQL)
硬解析:至少需要生成 CHILD CURSOR 占用SHARED POOL LATCH LIBRARY CACHE LATCH OLTP中的万恶之源(尽可能20/S以下)
2、SESSION CURSOR (位于PGA)
session_cached_cursors 软软解析
3、解析执行SQL过程:
PGA - SESSION CURSOR -N- PARENT CURSOR -Y- SESSION CURSOR CHILD CURSOR
-N- SESSION CURSOR SHARED CURSOR (PARENT CHILD)
-Y- 直接访问 PARENT CURSOR
4、SESSION CURSOR种类:隐式 显式 参考
5、绑定变量
OLTP减少硬解析 批量绑定
可以给表添加COMMENT也是DDL操作,重新硬解析 影响微乎其微
DBMS_SHARED_POOL.PURGE 可以删除SHARED CURSOR 强制SQL重新硬解析
绑定变量分级 内存分配 32字节 128字节 2000字节 2000以上(参数长度大于2000按实际分配,小于2000按2000分配)分配变化 计划改变
绑定变量捕获(只捕获where子句中的) 硬解析每次记录,软解析默认15分钟记录一次 V$SQL_BIND_CAPTURE DBA_HIST_SQL_STAT DBA_HIST_SQLBIND
6、游标共享
常规游标共享
自适用游标共享 (不安全的谓词条件 范围查询 有直方图统计信息的等值查询) 变量数不超过14个才能生效
V$SQL_CS_STATISTICS V$SQL_CS_SELECTIVITY
自适用执行流程:
第一次硬解析SQL,标记CHILD CURSOR 为 BIND SENSITIVE,存储runtime信息
第二次执行 软解析 重用CHILD CURSOR的解析树和执行计划
第三次执行 如果BIND SENSITIVE,并且第二次和第三次执行时的runtime统计信息和第一次统计信息有较大差异时,则第三次重新硬解析,产生新CHILD CURSOR,并标记此CHILD CURSOR为 BIND AWARE
标记为BIND AWARE的CHILD CURSOR对应的SQL再次执行时根据绑定变量的谓词选择率确定 硬/软/软软解析
可选择率处于之前硬解析在V$SQL_CS_STATISTICS中记录的范围内则用软/软软解析
如果硬解析并且产生计划与原有CHILD CURSOR中的计划相同,则除了新生成一个CHILD CURSOR外还会把原相同计划的CHILD CURSOR标记为非共享,并进行CURSOR合并(扩展相同执行计划的选择率V$SQL_CS_SELECTIVITY)
7、SESSION CURSOR生命周期:OPEN PARSE DESCRIBE DEFINE BIND PARALLELIZE EXECUTE FETCH CLOSE
8、应用类型:硬解析 软解析 软软解析 一次解析多次执行(软软解析改进版)