导回awr报告中的历史执行计划

我们在awr report中,往往能看到多个版本的执行计划,用不同的PLAN_HASH_VALUE表示。那么。有时候,我们发现sql生产了一个新的执行计划,如何让在不改变sql,不加hint的情况下,使用老的执行计划呢?

我们知道spm可以实现这样的功能,spm除了可以设置optimizer_capture_sql_plan_baselines为true(session级)和dbms_spm.LOAD_PLANS_FROM_CURSOR_CACHE从library cache中load到baseline外,我们还可以从sqlset中load,我们可以用LOAD_PLANS_FROM_SQLSET。

看下面一个例子:
1.创建用于测试的表:

我们看到sql是走全表扫描的,当前只有一个执行计划。

2.然后我们加上索引,产生第二个执行计划:

因此,问题是,如果我们希望还是用之前的第一个的执行计划,还是走全表扫描,(如exadata中走FTS的smart scan)但是又不可以改变SQL语句,我们应怎么做?

3. 答案是,我们可以用spm,将awr中的历史hash plan,load到baseline中。
3.1 首先,临时创建一个sqlset。

3.2 从awr报告中的执行计划,load进sqlset。
3.2.1 首先,看看awr报告中的snap和对应的时间点

我们看到全表扫描的那个hash value 3617692013 大约时间是在21:27:54,也就是END_INTERVAL_TIME的snap id 43到44之间。

3.2.2 根据对应的snap id,将awr中的执行计划,load到sqlset

3.3 将sqlset导入到baseline:

4. 我们现在可以来试试,发现语句已经是走之前第一个执行计划了,而且,我们没有改语句。

5.打扫战场。

参考:How to Load SQL Plans into SQL Plan Management (SPM) from the Automatic Workload Repository (AWR) (Doc ID 789888.1)

相关文章

3条评论

  1. 试验了一遍,结果还是走的第2个执行计划

    自己再消化消化。。。

  2. re 無限追云:cursor sharing是否设置为exact了?如果是force,你需要导绑定变量的那个,且在测试执行计划的时候,也用绑定变量的方式测试。btw,similar在11g中过期。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据