首页 > 数据库技术 > 详细

测试利用sql_profile 来改变sql 执行计划

时间:2014-10-30 12:54:26      阅读:253      评论:0      收藏:0      [点我收藏+]

第一: 对表建立索引后 走的是索引范围扫描,如果要改成全表扫描,看以下步骤实现:
SQL> create index idx_paulyitest_id on paulyi_test(object_id);

Index created.

SQL>
SQL>
SQL> explain plan for select * from paulyi_test where object_id=:a;

Explained.

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

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 978531679

--------------------------------------------------------------------------------
-----------------

| Id  | Operation                   | Name              | Rows  | Bytes | Cost (
%CPU)| Time     |

--------------------------------------------------------------------------------
-----------------


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                   |   134 | 27738 |     2
  (0)| 00:00:01 |

|   1 |  TABLE ACCESS BY INDEX ROWID| PAULYI_TEST       |   134 | 27738 |     2
  (0)| 00:00:01 |

|*  2 |   INDEX RANGE SCAN          | IDX_PAULYITEST_ID |    54 |       |     1
  (0)| 00:00:01 |

--------------------------------------------------------------------------------
-----------------

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------


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

  /*+
      BEGIN_OUTLINE_DATA
      INDEX_RS_ASC(@"SEL$1" "PAULYI_TEST"@"SEL$1" ("PAULYI_TEST"."OBJECT_ID"))
      OUTLINE_LEAF(@"SEL$1")
      ALL_ROWS
      DB_VERSION(‘11.2.0.4‘)

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
      OPTIMIZER_FEATURES_ENABLE(‘11.2.0.4‘)
      IGNORE_OPTIM_EMBEDDED_HINTS
      END_OUTLINE_DATA
  */

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

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

Note

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
-----
   - dynamic sampling used for this statement (level=2)

32 rows selected.

SQL>


第二:使用hint 固定住执行计划使用全表扫描:

SQL> explain plan for select /*+full(PAULYI_TEST) */* from paulyi_test where object_id=:a;

Explained.

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

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3957176904

--------------------------------------------------------------------------------
-

| Id  | Operation         | Name        | Rows  | Bytes | Cost (%CPU)| Time
|

--------------------------------------------------------------------------------
-


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |             |   134 | 27738 |    51   (0)| 00:00:01
|

|*  1 |  TABLE ACCESS FULL| PAULYI_TEST |   134 | 27738 |    51   (0)| 00:00:01
|

--------------------------------------------------------------------------------
-


Outline Data

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
-------------

  /*+
      BEGIN_OUTLINE_DATA
      FULL(@"SEL$1" "PAULYI_TEST"@"SEL$1")
      OUTLINE_LEAF(@"SEL$1")
      ALL_ROWS
      DB_VERSION(‘11.2.0.4‘)
      OPTIMIZER_FEATURES_ENABLE(‘11.2.0.4‘)
      IGNORE_OPTIM_EMBEDDED_HINTS
      END_OUTLINE_DATA

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
  */

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

   1 - filter("OBJECT_ID"=TO_NUMBER(:A))

Note
-----
   - dynamic sampling used for this statement (level=2)

31 rows selected.

SQL>

第三:使用sql_profile 固定全表扫描执行计划

declare
 v_hints sys.sqlprof_attr;
begin
 v_hints:=sys.sqlprof_attr(‘FULL(@"SEL$1" "PAULYI_TEST"@"SEL$1")‘);
 dbms_sqltune.import_sql_profile(‘select * from PAULYI_TEST where object_id=:a‘,v_hints,‘PAULYI_TEST‘,force_match=>true);
end;
/

SQL> explain plan for select * from paulyi_test where object_id=:a;

Explained.

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

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3957176904

--------------------------------------------------------------------------------
-

| Id  | Operation         | Name        | Rows  | Bytes | Cost (%CPU)| Time
|

--------------------------------------------------------------------------------
-


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |             |   134 | 27738 |    51   (0)| 00:00:01
|

|*  1 |  TABLE ACCESS FULL| PAULYI_TEST |   134 | 27738 |    51   (0)| 00:00:01
|

--------------------------------------------------------------------------------
-


Outline Data

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
-------------

  /*+
      BEGIN_OUTLINE_DATA
      FULL(@"SEL$1" "PAULYI_TEST"@"SEL$1")
      OUTLINE_LEAF(@"SEL$1")
      ALL_ROWS
      DB_VERSION(‘11.2.0.4‘)
      OPTIMIZER_FEATURES_ENABLE(‘11.2.0.4‘)
      IGNORE_OPTIM_EMBEDDED_HINTS
      END_OUTLINE_DATA

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
  */

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

   1 - filter("OBJECT_ID"=TO_NUMBER(:A))

Note
-----
   - dynamic sampling used for this statement (level=2)
   - SQL profile "PAULYI_TEST" used for this statement

32 rows selected.


可以在最后看到
SQL profile "PAULYI_TEST" used for this statement 已经使用上了。

测试利用sql_profile 来改变sql 执行计划

原文:http://blog.itpub.net/7199859/viewspace-1306192/

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!