session cursor cache 特性旨在减少软解析soft parse的性能损耗。通过将session_cached_cursor参数设置为一个大于0 的值启动会话session缓存游标的机制。
重复的对统一语句的解析调用经过3次以后将该语句的游标缓存移入到session cursor cache中,后续的解析调用将在session 缓存中找到对应的游标并不再需要重复打开该游标(askmac.cn)。
注意仅仅是那些重复引发三次解析调用的语句将被缓存,该机制避免了随机游标和硬绑定的游标浪费缓存。
主要UGA中的KKSUG结构定位缓存中的游标状态。kksug.kksugscc存放了session cached cursor信息数据。kksug.kksugscc.kkssclru 代表游标链表,kksug.kksugscc.kkssccnt代表session cursor cache中的游标数量,kksug.kksugscc.kksschit代表cursor cache的命中次数,即游标在session cursor cache中(askmac.cn)正好被找到的次数。
一般不需要特别去关心session_cached_cursors参数的内存损耗,一来这些session cursor cache中的栏位slot是可以被重用的,而且每一个slot也不会占用太多内存,一般在几十个字节左右。
同时如上所述KKSUG是位于UGA中的,所以在dedicated server mode独立服务器模式下session cursor cache在PGA=>UGA中, 在共享服务器模式下shared server mode下载SGA=>UGA中。
@+-> structkkssc @{ /* Session cached cursors */ /* open_cursors */ /* List of open curdef's */ /* Number of cursors open */ /* List of closed curdef's */ /* Cached frames and binds list */ kkssc kksugscc; ub4 kksugmoc; kgglk kksugocl; ub4 kksugopc; kgglk kksugccl; kgglk kksugcfb; @ /* front is the MRU side the tail is the LRU side */ @ kgglk kkssclru; /* linked list of cursors in session cursor cache */ @ kksccht *kksschst; /* hash table of cursors in the session cache */ @ ub4 kksscmcc; /* max number of cursors allowed in cache */ @ ub4 kkssccnt; /* count of cursors in session cursor cache */ @ ub4 kksschit; /* session cache cursor hits */ @ };
Leave a Reply