Chinaunix首页 | 论坛 | 博客
  • 博客访问: 863900
  • 博文数量: 72
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 435
  • 用 户 组: 普通用户
  • 注册时间: 2013-04-27 20:07
个人简介

郭一军,网名guoyJoe,尖峰在线培训创始人、Oracle OCM、ITPUB论坛Oracle认证版版主、2013最佳精华贴、Senior DBA、Oracle OCT、 ACOUG MEMBER、CSDN 认证专家、RHCE、在线技术分享的倡导者和实践者。 http://www.jianfengedu.com http://jianfengedu.taobao.com

文章分类
文章存档

2014年(72)

分类: Oracle

2014-06-17 07:40:16

一般只需要步骤三、四就可以完成执行计划的修改和固定,而outline和baseline则需要N多个步骤。
SQL PROFILE使用简单,不区分大小写,回车,空格,但是对DBA写HINT的能力要求比较高,因为SQL PROFILE要求HINT必须写明查询块名,
SQL PROFILE还有其他一些牛逼的特性。

我的示例里教了大家偷懒的做法,但是有时间我们还是最好认真把query block的东西学下。


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

步骤二-------------------------查看SQL默认执行计划,走了索引
explain plan for select * from LX_DB 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| LX_DB |
|*  2 |   INDEX RANGE SCAN          | idx_lxdb_id     |
-----------------------------------------------
Outline Data
-------------

  /*+
      BEGIN_OUTLINE_DATA
      INDEX_RS_ASC(@"SEL$1" " ("LX_DB"."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(LX_DB) */* from LX_DB 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| LX_DB |
-------------------------------------
Outline Data
-------------

  /*+
      BEGIN_OUTLINE_DATA
     FULL(@"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" ); ----------从上面Outline Data部分获取到的HINT
  dbms_sqltune.import_sql_profile('select * from LX_DB where object_id= :a', ----------SQL语句部分
                                  v_hints,
                                  'LX_DB', --------------------------------PROFILE 的名字
                                  force_match => true);
end;
/

步骤五-------------------------查看是否生效,已经生效了
explain plan for select * from LX_DB where object_id= :a;
select * from table(dbms_xplan.display(null,null,'outline'));-
--------------------------------------
| Id  | Operation         | Name    |
--------------------------------------
|   0 | SELECT STATEMENT  |         |
|*  1 |  TABLE ACCESS FULL| LX_DB |
--------------------------------------
Note
-----

   - SQL profile "LX_DB" used for this statement



**********本博客所有内容均为原创,如有转载请注明作者和出处!!!**********
QQ: 252803295
Email:dbathink@hotmail.com
尖峰官网:
尖峰淘宝:
WEIBO:
尖峰OCP认证考试群297227448  
尖峰OCM认证考试群99606943
尖峰MySQL研究院群314746420
尖峰JAVA研究院群 315405063  
尖峰Hadoop研究院群366294602
尖峰线上技术分享群252296815
尖峰SQL优化研究院群250057366






阅读(1791) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~