基于Oracle的SQL优化--学习(八)
Oracle里执行计划的稳定
使用SQL Profile来稳定执行计划
使用SQL Profile可以很容易的实现下面的目标:
(1)锁定或者说稳定执行计划。
(2)在不能修改目标SQL的SQL文本的情况下使目标SQL语句按指定的执行计划运行。
SQL Profile有两种类型,一种是Automatic,一种是Manual。
Automatic类型的SQL Profile
Automatic 类型的 SQL Profile 其实就是针对目标 sQL 的一些额外的调整信息,这些信息存储在数据字典里.当有了 Automatic 类型的 SQL Profile 后,Oracle在产生执行计划时就会根据它对目标 sQL 所涉及的统计信息等内容做相应的调整,因而能够在一定程度上避免产生错误的执行计划。不用担心 Automatic 类型的 sQL Profile 的准确性,因为 oracle 会使用类似于动态采样技术那样的手段来保证这些额外调整信息相对准确。
Automatic 类型的 SQL Profile 并不会像 Stored Outline 那样锁定目标 SOL 的执行计划,因为 Automatic 类型的 SQL Profile 的本质就是针对目标 SQL 的一些额外的调整信息,这些额外的调核信息需要与原目标 sQL 的相关统计信息等内容一起作用才能得到新的执行计划.即原始 sQL 的统计信息等内容一旦发生变化,即使原有 Automatic 类型的 SQL Profile 并没有改变,该 SQL 的执行计划也可能会发生变化.从这个意义上讲, Automatic 类型的 SOL Profile 并不能完全起到稳定目标 SOL 的执行计划的作用,虽然它确实可以用来调整执行计划。
Manual类型的SQL Profile
Manual类型的 SQL Profile 本质上就是一堆 Hint 的组合,这一堆 Hint 的组合实际上来源于执行计划中 Outline Data 部分的 Hint 组合。 Manual 类型的 SQL Profile同样可以在不更改目标 SQL的 SQL 文本的情况下调整其执行计划,而且更为重要的是, Manual 类型的 SQL Profile可以起到很好的稳定目标 SQL 的执行计划的作用,这一点是 Automatic 类型的 SQL Pro file 所不具备的。
使用SPM来稳定执行计划
SPM 是一种主动的稳定执行计划的手段,能够保证只有被验证过的执行计划才会被启用,当由于种种原因(比如统计信息的变更)而导致目标 SQL 产生了新的执行计划后.这个新的执行计划并不会被马上启用,直到它己经被我们验证过其执行效率会比原先执行计划高才会被启用。
当启用了SPM后每个SQL都会存在对应的SQL Plan Baseline,这个SQL Plan Baseline中存储的就是该SQL的执行计划,如果一个SQL有多个执行计划,那就有多个SQL Plan Baseline,可以从DBA_SQL_PLAN_BASELINE中查看目标SQL所有的SQL Plan Baseline。
DBA_SQL_PLAN_BASELINE中的列ENABLED和ACCEPTED用来描述一个SQL Plan Baseline所对应的执行计划是否被Oracle启用,只有ENABLED和ACCEPTED的值均为YES的SQL Plan Baseline所对应的执行计划才会被Oracle启用,如果一个sql有超过1个以上的SQL Plan Baseline的ENABLED和ACCEPTED的值均为YES,则Oracle会从中选择成本值最小的一个所对应的执行计划来作为该SQL的执行计划。