返回数说广场
3
自适应游标共享的整体执行流程了。Oracle数据库中自适应游标共享的整体执行流程为如下所示。
(1)当目标SQL第一次被执行时,Oracle会用硬解析,同时Oracle会根据一系列条件(如该SQL有没有使用绑定变量,参数CURSOR_SHARING的值是多少,绑定变量所在的列是否有直方图,该SQL的where条件是等值查询还是范围查询等)来判断是否将该SQL所对应的Child Cursor标记为Bind Sensitive。对于标记为Bind Sensitive的Child Cursor,Oracle会把执行该SQL时所对应的runtime统计信息额外地存储在该SQL所对应的Child Cursor中。
(2)当目标SQL第二次被执行时,Oracle会用软解析,并且会重用该SQL第一次执行时所产生的Child Cursor中存储的解析树和执行计划。
(3)当目标SQL第三次被执行时,如果该SQL所对应的Child Cursor已经被标记成了Bind Sensitive,同时Oracle在第二次和第三次执行该SQL时所记录的runtime统计信息和该SQL第一次硬解析时所记录的runtime统计信息均存在较大差异,则该SQL在第三次被执行时就会使用硬解析,Oracle此时会产生一个新的Child Cursor(这个新的Child Cursor会挂在原Parent Cursor下),并且Oracle会把这个新的Child Cursor标记为Bind Aware。
(4)对于标记为Bind Aware的Child Cursor所对应的目标SQL,当该SQL再次被执行时,Oracle就会根据当前传入的绑定变量值所对应的谓词条件的可选择率,来决定此时是用硬解析还是用软解析/软软解析。这里的判断原则是,如果当前传入的绑定变量值所在的谓词条件的可选择率处于该SQL之前硬解析时同名谓词条件在V$SQL_CS_STATISTICS中记录的可选择率的范围之内,则此时Oracle就会使用软解析/软软解析,并重用相关Child Cursor中存储的解析树和执行计划,反之则是硬解析。
0
3 160
分享
评论
热门数说



