v$sql ->存子游标信息(每一个子游标对应一次硬解析),关键信息是执行环境和执行计划
sql
v$sqlarea ->存父游标信息,对应sql语句的文本oracle
在v$sql中一个sql_id会存在多条语句,实际上v$sql中sql_id和child_number共同肯定一个惟一的sql,缘由是一个sql_id对应多个子游标。ide
不一样schema下相同sql,sql_id相同,单查询的对象不是同一用户测试
因为统计信息或者变量窥视,致使执行计划变化对象
游标的概念:指内存中可执行的sql对象,即SQL已经生成了执行计划。内存
父子游标都是能够共享的,称为共享游标,sql执行以前还要在会话的私有内存里生成1个会话游标,用于保存执行过程信息,这个在不一样会话间是不能共享的,会话游标对应的视图v$open_cursorci
硬解析:共享池中找不到游标,须要从新生成执行计划,即子游标(也可能包括父游标)hash
软解析:共享池中匹配到了子游标,可是须要生成会话游标it
软软解析:会话游标和共享游标都不须要从新生成class
v$sql的字段
child_number:sql子游标号,每一个sql_id从0开始
LOADS:产生子游标的次数,即硬解析次数,该值不必定跟v$sql的子游标数量一致,由于子游标可能被回收,清除
EXECUTIONS:执行次数,表示sql执行了几回
PARSE_CALLS:执行解析的次数,包括硬解析和软解析
PLAN_HASH_VALUE:执行计划的hash_value
案例:使用了绑定变量也可能产生硬解析
select * from scott.emp e where e.ename = 'abc'
select * from scott.emp e where e.ename = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
经测试,若是绑定变量长度差距太大,也可能触发硬解析,即便禁止变量窥视(_optim_peek_user_binds=false)也不行。
v$sql_shared_cursor,根据sql_id找到硬解析缘由
CURSOR_SHARING
exact:默认,sql语句彻底相同(执行环境都得相同,好比查询表的数据分布),如有不一样,则不会共享游标
force:强制绑定变量
similar:在oracle认为某条语句谓词条件可能会影响他的执行计划,才会被从新分析,不然重用sql