每个sql会产生两个share cursor 父游标(parent cursor)和子游标(child cursor) ,缓存在库缓存区的对象都是以一种叫库缓存对象句柄(library cache object handle)的结构存存储在库缓存中,oracle就是通过访问相关的库缓存对象句柄来访问对应的库缓存对象的,上面的每一个红圈里的方块就是一个库缓存对象句柄
名词
解释:
hash buckets : 整个库缓存可以看作是由一组hash bucket 所组成,每一个hash bucket对应一个不同的hash值。对于单个的hash bucket ,他里面存储的就是哈希值相同的所有库缓存对象句柄。
parent cursor : 存储的是sql的文本,
child cursor : 存储的是 可以被重用的解析树和执行计划。
软解析: 根据这条sql文本计算出相应的hash 值,并且根据hash值去找对应的hash bucket , 然后在匹配到的hash bucket 中去查找匹配的parent cursor ,然后再遍历属于这个parent cursor的所有child cursor ,找到匹配的child cursor ,如果能顺利的找到,这就可以直接调用解析树和执行计划
硬解析: 如果没有找到匹配的父游标,或者找到了父游标,没有找到对应的子游标,那么oracle就会重新开始解析该目标sql, 并且就会在后面重新生成一个新的父游标和子游标或者是只生成子游标(找到了父游标)
同一个sql对应的hash值是一样的,并且同一个sql也可能对应多个不同的解析树和执行计划。正是因为这样可以减少hash bucket 中的库缓存对象句柄链表的长度,并且不同的sql对应的hash 值也可能相同,这样就可以公用一个hash bucket ,减少了hash bucket 的数量,正式由于这个原因才设计成了父游标和子游标并存的结构
session cursor: 用于在当前session中的解析和执行sql,与session是一一对应的,不同的session是不能共享的,有生命周期,使用过程中肯定至少经历 open ,parse ,bind,execute,fetch 的一个或多个阶段。并且用过的session cursor 不一定缓存在对应的session pga中,oracle 依据session cursor 来将目标sql所涉及到的数据从buffer cache 中读到PGA,然后再排序,表连接等。
Soft Soft Parse: oracle 在解析和执行目标sql时,会首先在当前session中的PGA中查看是否缓存有匹配的session cursor ,如果有直接用,这样就是软软解析,和软解析相比,省掉了open一个新的session cursor所需的时间和资源,同时也省掉了close一个现有的session cursor所需的时间和资源.
soft soft parse 的前提: session_cached_cursors >0