查看: 6669|回复: 9

[原创] 用outline修改固定执行计划

[复制链接]
论坛徽章:
21
奔驰
日期:2013-08-06 15:23:05日产
日期:2013-08-07 22:56:38蜘蛛蛋
日期:2012-12-29 19:15:08奥迪
日期:2013-08-07 17:02:24数据库板块每日发贴之星
日期:2010-06-28 01:01:03奥迪
日期:2013-08-13 10:10:28本田
日期:2013-11-20 15:17:02优秀写手
日期:2013-12-18 09:29:08玉兔
日期:2014-03-04 16:47:17铁扇公主
日期:2012-02-21 15:02:40
跳转到指定楼层
1#
发表于 2011-6-9 20:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
http://www.itpub.net/thread-1445125-1-1.html
打算把固定执行计划的方法做个整理和比较。上面的链接是SQL PROFILE的用法。这篇说下OUTLINE的用法。

目的:让执行计划走上全表扫描

步骤一-------------------------创建测试表,根据DBA_OBJECTS创建,OBJECT_ID上有索引
Create table wxh_tbd as select * from dba_objects;
create index t_3 on wxh_tbd(object_id);


步骤二--------------------------创建outline。由于默认的执行计划是索引的,因此后续我们需要修改这个OUTLINE。让它走全表
create or replace outline pub_out on select * from wxh_tbd where object_id=:1;


步骤三--------------------------创建两个私有OUTLINE,之所以创建两个,是为了让彼此的HINT做交换
create or replace private outline pri_out_1 on select * from wxh_tbd where object_id=:1;
create or replace private outline pri_out_2 on select /*+ full(wxh_tbd) */ * from wxh_tbd where object_id=:1;

步骤四-------------------------交换两个OUTLINE的HITN
update ol$hints set ol_name=decode(ol_name,'PRI_OUT_1','PRI_OUT_2','PRI_OUT_2','PRI_OUT_1') where ol_name in ('PRI_OUT_1','PRI_OUT_2');
commit;

步骤五------------------------测试结果。在当前SESSION生效,看到执行计划NOTE部分用到了OUTLINE
alter session set use_private_outlines=true;
explain plan for
select * from wxh_tbd where object_id=:1;
select * from table(dbms_xplan.display(null,null,'outline'));
-----------------------------------------------------------------------------
| Id  | Operation         | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |         |   577 |    99K|   140   (2)| 00:00:02 |
|*  1 |  TABLE ACCESS FULL| WXH_TBD |   577 |    99K|   140   (2)| 00:00:02 |
-----------------------------------------------------------------------------
Note
-----
   - outline "PRI_OUT_1" used for this statement


步骤六--------------------------发布到公共OUTLINE
create or replace outline pub_out from private PRI_OUT_1;

步骤七--------------------------另开一个SESSION,确定已经用到了OUTLINE
SQL> explain plan for
  2   select * from wxh_tbd where object_id=:1;

已解释。
SQL> select * from table(dbms_xplan.display(null,null,'outline'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3295978849

-----------------------------------------------------------------------------
| Id  | Operation         | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |         |   577 |    99K|   140   (2)| 00:00:02 |
|*  1 |  TABLE ACCESS FULL| WXH_TBD |   577 |    99K|   140   (2)| 00:00:02 |
-----------------------------------------------------------------------------

Note
-----
   - outline "PUB_OUT" used for this statement

论坛徽章:
58
生肖徽章2007版:马
日期:2009-11-06 23:12:33授权会员
日期:2013-01-10 14:38:592013年新春福章
日期:2013-02-25 14:51:24马自达
日期:2013-08-07 10:54:45红旗
日期:2013-08-09 13:48:48劳斯莱斯
日期:2013-09-12 15:56:37萤石
日期:2013-10-31 08:44:19优秀写手
日期:2013-12-18 09:29:13Jeep
日期:2014-01-14 10:53:432014年新春福章
日期:2014-02-18 16:43:09
2#
发表于 2011-6-9 21:32 | 只看该作者
发贴好勤快啊!

学习……

使用道具 举报

回复
论坛徽章:
58
生肖徽章2007版:马
日期:2009-11-06 23:12:33授权会员
日期:2013-01-10 14:38:592013年新春福章
日期:2013-02-25 14:51:24马自达
日期:2013-08-07 10:54:45红旗
日期:2013-08-09 13:48:48劳斯莱斯
日期:2013-09-12 15:56:37萤石
日期:2013-10-31 08:44:19优秀写手
日期:2013-12-18 09:29:13Jeep
日期:2014-01-14 10:53:432014年新春福章
日期:2014-02-18 16:43:09
3#
发表于 2011-6-9 21:35 | 只看该作者
应用dba一般忙什么?

使用道具 举报

回复
论坛徽章:
9
2009新春纪念徽章
日期:2009-01-04 14:52:28祖国60周年纪念徽章
日期:2009-10-09 08:28:00ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51蛋疼蛋
日期:2011-08-09 14:26:55ITPUB十周年纪念徽章
日期:2011-11-01 16:24:51ITPUB 11周年纪念徽章
日期:2012-10-09 18:09:19奥迪
日期:2013-09-12 15:57:042014年新春福章
日期:2014-02-18 16:43:09马上有钱
日期:2014-02-18 16:43:09
4#
发表于 2011-6-9 21:54 | 只看该作者
都是学路易斯的, 到了这里就原创了。

使用道具 举报

回复
论坛徽章:
10
八级虎吧徽章
日期:2009-02-09 17:58:50ITPUB 11周年纪念徽章
日期:2012-10-09 18:09:19蜘蛛蛋
日期:2012-01-12 13:27:03ITPUB十周年纪念徽章
日期:2011-11-01 16:24:51开发板块每日发贴之星
日期:2011-06-08 01:01:012011新春纪念徽章
日期:2011-02-18 11:43:33ITPUB9周年纪念徽章
日期:2010-10-08 09:28:532010年世界杯参赛球队:西班牙
日期:2010-06-14 22:08:542009日食纪念
日期:2009-07-22 09:30:00一汽
日期:2013-08-08 10:50:32
5#
发表于 2011-6-29 13:41 | 只看该作者
学习了~

使用道具 举报

回复
论坛徽章:
10
八级虎吧徽章
日期:2009-02-09 17:58:50ITPUB 11周年纪念徽章
日期:2012-10-09 18:09:19蜘蛛蛋
日期:2012-01-12 13:27:03ITPUB十周年纪念徽章
日期:2011-11-01 16:24:51开发板块每日发贴之星
日期:2011-06-08 01:01:012011新春纪念徽章
日期:2011-02-18 11:43:33ITPUB9周年纪念徽章
日期:2010-10-08 09:28:532010年世界杯参赛球队:西班牙
日期:2010-06-14 22:08:542009日食纪念
日期:2009-07-22 09:30:00一汽
日期:2013-08-08 10:50:32
6#
发表于 2011-6-29 14:34 | 只看该作者
请教一下我的环境是
SQL*Plus: Release 10.2.0.4.0 - Production on Wed Jun 29 14:25:40 2011
在执行到第五步时反馈的结果如下:
SQL> select * from table(dbms_xplan.display(null,null,'outline'));

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 2433403449

---------------------------------------------------------------------------------------
| Id  | Operation                   | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |         |  2680 |   463K|    36   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| WXH_TBD |  2680 |   463K|    36   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | T_3     |  1072 |       |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------------------

Outline Data
-------------

  /*+
      BEGIN_OUTLINE_DATA
      INDEX_RS_ASC(@"SEL$1" "WXH_TBD"@"SEL$1" ("WXH_TBD"."OBJECT_ID"))
      OUTLINE_LEAF(@"SEL$1")
      ALL_ROWS
      OPTIMIZER_FEATURES_ENABLE('10.2.0.4')
      IGNORE_OPTIM_EMBEDDED_HINTS
      END_OUTLINE_DATA
  */

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("OBJECT_ID"=TO_NUMBER(:1))

Note
-----
   - outline "PRI_OUT_1" used for this statement

31 rows selected.

Elapsed: 00:00:00.01
请问是什么原因呢?

使用道具 举报

回复
论坛徽章:
190
生肖徽章:狗
日期:2006-11-23 04:26:03生肖徽章:羊
日期:2007-09-26 17:08:21生肖徽章:马
日期:2007-09-26 17:08:49授权会员
日期:2007-12-31 19:14:41生肖徽章2007版:牛
日期:2008-03-28 10:02:30奥运会纪念徽章:柔道
日期:2008-04-30 16:28:44奥运会纪念徽章:垒球
日期:2008-05-12 21:28:28奥运会纪念徽章:体操
日期:2008-06-26 10:00:41奥运会纪念徽章:沙滩排球
日期:2008-07-27 12:41:59奥运会纪念徽章:艺术体操
日期:2008-07-30 11:09:47
7#
发表于 2011-6-29 15:04 | 只看该作者
很清晰。。。

使用道具 举报

回复
论坛徽章:
2
2011新春纪念徽章
日期:2011-02-18 11:43:35ITPUB十周年纪念徽章
日期:2011-11-01 16:25:22
8#
发表于 2011-6-29 15:08 | 只看该作者
我也是,按楼主的步骤操作,在第五步的时候,执行计划中仍然显示走索引而非全表,不过在最后显示- outline "PRI_OUT_1" used for this statement

而且查看SELECT name, category, used FROM user_outlines中也显示USED,说明已经使用了outline。但是执行计划中却没有按预期走,不解

使用道具 举报

回复
论坛徽章:
9
2009新春纪念徽章
日期:2009-01-04 14:52:28祖国60周年纪念徽章
日期:2009-10-09 08:28:00ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51蛋疼蛋
日期:2011-08-09 14:26:55ITPUB十周年纪念徽章
日期:2011-11-01 16:24:51ITPUB 11周年纪念徽章
日期:2012-10-09 18:09:19奥迪
日期:2013-09-12 15:57:042014年新春福章
日期:2014-02-18 16:43:09马上有钱
日期:2014-02-18 16:43:09
9#
发表于 2011-6-29 16:52 | 只看该作者
看看你自己交换OUTLINE的时候是否正常,交换了肯定不会有问题。 有空看看路易斯的测试,除了交换OUTLINE之外,还有一个东西要交换(这个交换不做也没关系就是,只是路易斯考虑的周全而已)

使用道具 举报

回复
论坛徽章:
0
10#
发表于 2011-6-30 14:51 | 只看该作者
测试了了一下 同样的问题第五步!!!!!!
楼主收站内短信

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表