查看: 12226|回复: 22

[讨论] SQL PROFILE修改固定执行计划

[复制链接]
论坛徽章:
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 16:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
发给团队的,有需要的可以参照下。下面是原文,懒的编辑了

SQL PROFILE的用法示例,下周周会给应用DBA演示下。一般只需要步骤三、四就可以完成执行计划的修改和固定,而outline和baseline则需要N多个步骤。
SQL PROFILE使用简单,不区分大小写,回车,空格,但是对DBA写HINT的能力要求比较高,因为SQL PROFILE要求HINT必须写明查询块名。
我的示例里教了大家偷懒的做法,但是有时间我们还是最好认真把query block的东西学下。
SQL PROFILE还有其他一些牛逼的特性,具体其他细节,周会上再说。

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

步骤二-------------------------查看SQL默认执行计划,走了索引
explain plan for select * from wxh_tbd where object_id= :a;
select * from table(dbms_xplan.display(null,null,'outline'));-------------------通过指定outline可以获取到系统为我们生成的hint
-----------------------------------------------
| Id  | Operation                   | Name    |
-----------------------------------------------
|   0 | SELECT STATEMENT            |         |
|   1 |  TABLE ACCESS BY INDEX ROWID| WXH_TBD |
|*  2 |   INDEX RANGE SCAN          | T_3     |
-----------------------------------------------
Outline Data
-------------

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

步骤3-------------------------如果我们想让它走全表扫描,获取全表扫描HINT
explain plan for select /*+ full(wxh_tbd) */* from wxh_tbd where object_id= :a;-----------增加HINT
select * from table(dbms_xplan.display(null,null,'outline'));------------可以看到全表扫描的hint已经为我们生成了,我们选取必要的hint就OK了,其他的可以不要
-------------------------------------
| Id  | Operation         | Name    |
-------------------------------------
|   0 | SELECT STATEMENT  |         |
|*  1 |  TABLE ACCESS FULL| WXH_TBD |
-------------------------------------
Outline Data
-------------

  /*+
      BEGIN_OUTLINE_DATA
     FULL(@"SEL$1" "WXH_TBD"@"SEL$1")
      OUTLINE_LEAF(@"SEL$1")
      ALL_ROWS
      DB_VERSION('11.1.0.7')
      OPTIMIZER_FEATURES_ENABLE('11.1.0.7')
      IGNORE_OPTIM_EMBEDDED_HINTS
      END_OUTLINE_DATA
  */

步骤4--------------------------使用sql profile
declare
  v_hints sys.sqlprof_attr;
begin
  v_hints := sys.sqlprof_attr('FULL(@"SEL$1" "WXH_TBD"@"SEL$1")'); ----------从上面Outline Data部分获取到的HINT
  dbms_sqltune.import_sql_profile('select * from wxh_tbd where object_id= :a', ----------SQL语句部分
                                  v_hints,
                                  'WXH_TBD', --------------------------------PROFILE 的名字
                                  force_match => true);
end;
/

步骤五-------------------------查看是否生效,已经生效了
explain plan for select * from wxh_tbd where object_id= :a;
select * from table(dbms_xplan.display);
--------------------------------------
| Id  | Operation         | Name    |
--------------------------------------
|   0 | SELECT STATEMENT  |         |
|*  1 |  TABLE ACCESS FULL| WXH_TBD |
--------------------------------------
Note
-----
   - SQL profile "WXH_TBD" used for this statement


[ 本帖最后由 wei-xh 于 2011-6-9 16:48 编辑 ]
论坛徽章:
314
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
2#
发表于 2011-6-9 17:09 | 只看该作者
楼主最好说明你的操作环境,

使用道具 举报

回复
论坛徽章:
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
3#
 楼主| 发表于 2011-6-9 17:18 | 只看该作者
原帖由 ZALBB 于 2011-6-9 17:09 发表
楼主最好说明你的操作环境,


呵呵。
ops$admin@CRMG>select * from v$version where rownum=1;

BANNER
----------------------------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
14
授权会员
日期:2005-10-30 17:05:33马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11优秀写手
日期:2013-12-27 06:00:12阿斯顿马丁
日期:2013-10-08 16:15:36咸鸭蛋
日期:2013-05-07 13:52:40蜘蛛蛋
日期:2013-05-02 13:41:16蛋疼蛋
日期:2013-04-24 14:22:58咸鸭蛋
日期:2013-03-13 09:33:472013年新春福章
日期:2013-02-25 14:51:24
4#
发表于 2011-6-9 17:57 | 只看该作者
楼主,10G的版本可以用吗?

使用道具 举报

回复
论坛徽章:
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
5#
发表于 2011-6-9 18:24 | 只看该作者
10g为什么不能用?

使用道具 举报

回复
论坛徽章:
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
6#
 楼主| 发表于 2011-6-9 18:45 | 只看该作者
原帖由 yyp2009 于 2011-6-9 18:24 发表
10g为什么不能用?

10G可以用。

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
11
授权会员
日期:2009-06-17 21:55:31马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:02劳斯莱斯
日期:2014-01-16 21:09:18复活蛋
日期:2012-11-21 19:44:35ITPUB 11周年纪念徽章
日期:2012-10-09 18:07:31ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26ITPUB元老
日期:2010-08-09 11:32:43生肖徽章2007版:虎
日期:2009-11-24 18:46:412009日食纪念
日期:2009-07-22 09:30:00
7#
发表于 2011-6-9 23:16 | 只看该作者
高,学习了

使用道具 举报

回复
论坛徽章:
194
红宝石
日期:2014-05-09 08:24:37萤石
日期:2014-01-03 10:25:39奥运会纪念徽章:羽毛球
日期:2008-07-01 10:46:06奥运会纪念徽章:马术
日期:2008-07-07 17:43:24奥运会纪念徽章:射箭
日期:2008-07-25 18:07:39奥运会纪念徽章:皮划艇激流回旋
日期:2008-07-30 10:02:57奥运会纪念徽章:花样游泳
日期:2008-09-26 13:02:43奥运会纪念徽章:排球
日期:2008-12-03 11:23:272010新春纪念徽章
日期:2010-01-04 08:33:082010年世界杯参赛球队:澳大利亚
日期:2010-02-26 11:08:44
8#
发表于 2011-6-10 08:44 | 只看该作者
我使用toad来做,更加傻瓜,我现在连命令都没记住

使用道具 举报

回复
论坛徽章:
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
9#
 楼主| 发表于 2011-6-10 09:08 | 只看该作者
原帖由 lfree 于 2011-6-10 08:44 发表
我使用toad来做,更加傻瓜,我现在连命令都没记住


我们产品环境PL/SQL,TOAD这些都不能用,完全用PUTTY之类的工具。。。。。

使用道具 举报

回复
论坛徽章:
13
蛋疼蛋
日期:2011-06-01 17:04:11ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:00奥运会纪念徽章:自行车
日期:2012-08-11 11:23:21蛋疼蛋
日期:2012-05-02 22:02:58紫蛋头
日期:2012-01-17 17:01:58鲜花蛋
日期:2012-01-10 09:40:482012新春纪念徽章
日期:2012-01-04 11:57:56ITPUB十周年纪念徽章
日期:2011-11-01 16:26:29ITPUB十周年纪念徽章
日期:2011-09-27 16:34:13授权会员
日期:2011-08-29 11:20:27
10#
发表于 2011-6-10 09:17 | 只看该作者
9i  可以这样做吗?
我才做了哈,怎么看到这个效果。
=====================================================

SQL> select * from v$version where rownum = 1;

BANNER
-------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production

SQL> select * from table(dbms_xplan.display(null,null , 'outline')) ;

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------
Error: format 'outline' unknown

使用道具 举报

回复

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

本版积分规则 发表回复

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