在Oracle 11g前,我们可以借助存储大纲(Stored Outline)和SQL Profile来帮助我们固定某个SQL语句的执行计划。
11g中,Oracle 提供了SPM(Sql Plan Management)。
通过这个特性,可以考虑让Oracle自动去判断某个SQL的新的执行计划是否更加合理(成本更低),只有在新的执行计划比原来的执行计划更好才会被使用,从而保护了执行计划的稳定性和SQL语句的执行效率。
可以考虑手工捕获和自动捕获两种方式,这里我们采用手工捕获(11.2的缺省设置是非自动捕获)。
首先查看当前为禁止自动捕获的状态:
|
当前SPM中没有内容:
|
手工加载一个SQL到SPM中:
|
由于上一个测试,我们已经有了正确的执行计划,即:
|
下面,我们装载指定的执行计划:
|
确认该执行计划的OUTLINE:
|
这里看到是我们需要的走索引的outline,详细的OUTLINE信息如下:
|
现在我们删除profile以前用coe绑定的sql profile:
|
再次验证SPM的执行计划:
|
执行SQL,发现SPM可以固定执行计划,使用了我们期待的:
|
这里看到已经使用了SPM中的SQL Profile:SQL_PLAN_0k9pqn7v9yvuw02b73393
总结:
这里已经使用了我们的SPM(SQL_PLAN_0k9pqn7v9yvuw02b73393)固定了执行计划,sql使用了索引
说明SPM绑定执行计划的方式比hint的优先级高