1、LRU链
LRU链存放了SQL和SQL执行计划,如果共享池空间比较紧张,一些SQL与执行计划就会被释放掉。只有recreate类型thunk才会被链接到LRU链上,LRU链上没有freeable类型thunk。recreate与freeable类型thunk大都是子堆对应的thunk,子堆里主要存放了SQL语句。正在执行的SQL语句的thunk是不会被链到LRU上的,等执行完了会被链到LRU上。
LRU链存放了SQL和SQL执行计划,如果共享池空间比较紧张,一些SQL与执行计划就会被释放掉。只有recreate类型thunk才会被链接到LRU链上,LRU链上没有freeable类型thunk。recreate与freeable类型thunk大都是子堆对应的thunk,子堆里主要存放了SQL语句。正在执行的SQL语句的thunk是不会被链到LRU上的,等执行完了会被链到LRU上。
2、LRU链图
没有把recreate与freeable类型的放在一条链上,这样的设计结构减小了LRU链长度,加快了搜索速度。
当sql语句被执行以以后会被挂到LRU链上,在LRU链上的thunk必须为recreate类型。如果SQL比较大需要多个thunk,则在其recreate thunk上再挂一个freeable的thunk(如果需要4个thunk就再挂3个freeable的thunk)
3、LRU链上thunk的释放
以下面图为例
当执行一个SQL语句(需要8k空间),没有可用空间时,oracle要覆盖这个子堆时,会先覆盖掉thunk 0,然后thunk 1。剩下的thunk 2,3会链到freeliist上。
当执行一个SQL语句(需要24k)时,没有可用空间,oracle会覆盖掉这个子堆,并且再覆盖一个子堆,拿另一个子堆的8k空间,另一个子堆的其他thunk会被挂到freelist上。