oracle cursor和绑定变量



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、应用类型:硬解析 软解析 软软解析 一次解析多次执行(软软解析改进版)

你可能感兴趣的:(Oracle,sql优化)