一直不是很理解软软解析,究竟是个什么概念。借助同事的ppt再结合以往看的书,总算是把一条线路理清晰了
老样子,先过下硬解析和软解析的概念
硬解析: Shared Pool 首先查找是否有父游标。如果父游标不存在,则加载到Library Cache ,生成父游标。然后进行语句转换(逻辑优化):语句的转换过程,将语句转换为SQL引擎读懂的格式各种语句的写法。接着进行(物理优化):根据各种语句的写法,收集对象的统计信息,生成各种执行计划。搜索这些执行计划,计算开销,选择最低开销的执行计划对应的语句,加载到库缓冲区,包括执行计划。
软解析:Shared Pool 首先查找是否有父游标。如果父游标存在,查找是否有共享的子游标。如果不存在,语句转换(逻辑优化):语句的转换过程,将语句转换为SQL引擎读懂的格式。各种语句的写法。接着进行(物理优化):根据各种语句的写法,收集对象的统计信息,生成各种执行计划。搜索这些执行计划,计算开销,选择最低开销的执行计划对应的语句,加载到库缓冲区,包括执行计划。
判断软硬解析的关键在于其父游标存在与否。
然后是本文的重点,软软解析。
在老白的dba的思想天空中,是说,软软解析是软解析的一种特例。当上述软解析的情况中,共享的子游标存在,且相关对象仍在内存当中,则可以直接调用位于library cache当中的执行计划。
我之前一直没有明白的是,这边所相关的对象是指什么,一度以为是指buffer cache中的块,很明显不是这个意思。
为了要理解这句话,很有必要先了解下pga的构造
很明显,其中的私有sql区,和csa中存放了相关的数据对象,和老白所说的一结合,那明白了,所指的对象是存放在这里。
既然是存放在pga,那所谓的软软解析那就必须得在同一个会话中才能出现了。
那除此之外,还有什么相关限制呢?
在同事的ppt中了解到以下两个参数SESSION_CACHED_CURSORS,HOLD_CURSOR。
前者表明,一个会话中可以持有的游标数量;后者表明该会话中,某一个sql执行完毕时,是否从pga中完全删除该游标的相关信息。
除了上述解析外,还有种不解析只执行的情况。不过该情况,我还不能明白是什么造成的。继续学习了……