love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

Phone:18180207355 提供专业Oracle/MySQL/PostgreSQL数据恢复、性能优化、迁移升级、紧急救援等服务

使用sql profle进行偷梁换柱的小例子–outline exchange(续)

前几天写了一篇sql profile来固定非绑定变量sql的文章,微博上有人提到了outline exchange也可以实现
类似的功能,那我们就再来看看这和sql profile有什么差异,如何去实现:

下面我们再来创建一个测试表,用于测试:

下面来创建outline:

我们这里的目的是要想让object_id=2000的sql也走index range scan。

下面也为object_id=2000的sql创建一个outline,然后进行对比:

我们对比上面的hint部分,可以发现,一个是full 一个是index_rs_asc,其他完全一致,也就是说,
如果我们想让object_id=2000的sql走index range scan,那么我们只需要把hint修改即可。

那现在的问题的是:我们去哪儿修改呢?

我们可以看到,outline信息是存在outln用户下面的ol$hints表中,我们这里来更改hint#为1的 hint_text部分:

那下面我们来看看执行计划是否会变成index rang scan?

我们可以看到使用了index range scan,成功实现了egale_fan讲的outline exchange。

但是,这仍然有一个很大的问题,既然我应用没有使用绑定变量,那么你要固定其执行计划,也就是说
你必须为每个一个sql创建一个outline,那样太费劲了,而且不现实。

我想这或许是sql profile引入的原因,其中有一点大家应该都看到了,sql profile有一个force_match的功能,
而outline则不具备。

3 Responses to “使用sql profle进行偷梁换柱的小例子–outline exchange(续)”

  1. Lixora Says:
  2. Lisf4142 Says:

    如果是绑定变量该如何呢

  3. lizhenxu Says:

    那更简单啊,以前这里有个例子。http://www.killdb.com/2011/07/12/%e5%85%b3%e4%ba%8eoutline%e7%9a%84%e4%b8%80%e7%82%b9%e6%b5%8b%e8%af%95%e5%92%8c%e6%80%bb%e7%bb%93.html

Leave a Reply

You must be logged in to post a comment.