Oracle 用hint来影响执行计划

全表扫描提示
SYS@ prod> grant plustrace to hr ;

Grant succeeded.

SYS@ prod> conn hr/hr
Connected.
HR@ prod> set autotrace on
HR@ prod> select /*+ full(employees) */ first_name from employees where employee_id = 100 ;

FIRST_NAME
--------------------
Steven


Execution Plan
----------------------------------------------------------
Plan hash value: 1445457117

-------------------------------------------------------------------------------
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |           |     1 |    11 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| EMPLOYEES |     1 |    11 |     3   (0)| 00:00:01 |
-------------------------------------------------------------------------------

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

   1 - filter("EMPLOYEE_ID"=100)


Statistics
----------------------------------------------------------
        736  recursive calls
          0  db block gets
        193  consistent gets
          6  physical reads
          0  redo size
        532  bytes sent via SQL*Net to client
        523  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          6  sorts (memory)
          0  sorts (disk)
          1  rows processed

HR@ prod> select first_name from employees where employee_id = 100 ;

FIRST_NAME
--------------------
Steven


Execution Plan
----------------------------------------------------------
Plan hash value: 1833546154

---------------------------------------------------------------------------------------------
| Id  | Operation                   | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |               |     1 |    11 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| EMPLOYEES     |     1 |    11 |     1   (0)| 00:00:01 |
|*  2 |   INDEX UNIQUE SCAN         | EMP_EMP_ID_PK |     1 |       |     0   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------

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

   2 - access("EMPLOYEE_ID"=100)


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
          2  consistent gets
          1  physical reads
          0  redo size
        532  bytes sent via SQL*Net to client
        523  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
1rows processed

按顺序联结提示,表联结会按照FROM后面的顺序进行。
SH@ prod> set autotrace on
SH@ prod> select /*+ ordered */ promo_name , cust_first_name , prod_name , amount_sold from sales , promotions , customers , products 
  2  where sales.prod_id = 100 ;

no rows selected


Execution Plan
----------------------------------------------------------
Plan hash value: 2619432180

------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                             | Name           | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                      |                |   713G|    43T|    13G  (1)|999:59:59 |       |       |
|   1 |  MERGE JOIN CARTESIAN                 |                |   713G|    43T|    13G  (1)|999:59:59 |       |       |
|   2 |   MERGE JOIN CARTESIAN                |                |  9910M|   378G|    71M  (1)|239:56:32 |       |       |
|   3 |    MERGE JOIN CARTESIAN               |                |   178K|  5928K|  5582   (1)| 00:01:07 |       |       |
|   4 |     PARTITION RANGE ALL               |                |   355 |  3195 |    94   (0)| 00:00:02 |     1 |    28 |
|   5 |      TABLE ACCESS BY LOCAL INDEX ROWID| SALES          |   355 |  3195 |    94   (0)| 00:00:02 |     1 |    28 |
|   6 |       BITMAP CONVERSION TO ROWIDS     |                |       |       |            |          |       |       |
|*  7 |        BITMAP INDEX SINGLE VALUE      | SALES_PROD_BIX |       |       |            |          |     1 |    28 |
|   8 |     BUFFER SORT                       |                |   503 | 12575 |  5487   (1)| 00:01:06 |       |       |
|   9 |      TABLE ACCESS FULL                | PROMOTIONS     |   503 | 12575 |    15   (0)| 00:00:01 |       |       |
|  10 |    BUFFER SORT                        |                | 55500 |   379K|    71M  (1)|239:56:32 |       |       |
|  11 |     TABLE ACCESS FULL                 | CUSTOMERS      | 55500 |   379K|   403   (1)| 00:00:05 |       |       |
|  12 |   BUFFER SORT                         |                |    72 |  1872 |    13G  (1)|999:59:59 |       |       |
|  13 |    TABLE ACCESS FULL                  | PRODUCTS       |    72 |  1872 |     1   (0)| 00:00:01 |       |       |
------------------------------------------------------------------------------------------------------------------------

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

   7 - access("SALES"."PROD_ID"=100)


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
         44  consistent gets
          0  physical reads
          0  redo size
        559  bytes sent via SQL*Net to client
        512  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
0rows processed

去掉提示后,PRODUCTS与CUSTOMERS的顺序发生了颠倒。
SH@ prod> select promo_name , cust_first_name , prod_name , amount_sold from sales , promotions , customers , products 
  2  where sales.prod_id = 100 ;

no rows selected


Execution Plan
----------------------------------------------------------
Plan hash value: 3204799813

------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                             | Name           | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                      |                |   713G|    43T|  5182M  (1)|999:59:59 |       |       |
|   1 |  MERGE JOIN CARTESIAN                 |                |   713G|    43T|  5182M  (1)|999:59:59 |       |       |
|   2 |   MERGE JOIN CARTESIAN                |                |    12M|   735M|   247K  (1)| 00:49:32 |       |       |
|   3 |    MERGE JOIN CARTESIAN               |                |   178K|  5928K|  5582   (1)| 00:01:07 |       |       |
|   4 |     PARTITION RANGE ALL               |                |   355 |  3195 |    94   (0)| 00:00:02 |     1 |    28 |
|   5 |      TABLE ACCESS BY LOCAL INDEX ROWID| SALES          |   355 |  3195 |    94   (0)| 00:00:02 |     1 |    28 |
|   6 |       BITMAP CONVERSION TO ROWIDS     |                |       |       |            |          |       |       |
|*  7 |        BITMAP INDEX SINGLE VALUE      | SALES_PROD_BIX |       |       |            |          |     1 |    28 |
|   8 |     BUFFER SORT                       |                |   503 | 12575 |  5487   (1)| 00:01:06 |       |       |
|   9 |      TABLE ACCESS FULL                | PROMOTIONS     |   503 | 12575 |    15   (0)| 00:00:01 |       |       |
|  10 |    BUFFER SORT                        |                |    72 |  1872 |   247K  (1)| 00:49:32 |       |       |
|  11 |     TABLE ACCESS FULL                 | PRODUCTS       |    72 |  1872 |     1   (0)| 00:00:01 |       |       |
|  12 |   BUFFER SORT                         |                | 55500 |   379K|  5182M  (1)|999:59:59 |       |       |
|  13 |    TABLE ACCESS FULL                  | CUSTOMERS      | 55500 |   379K|   403   (1)| 00:00:05 |       |       |
------------------------------------------------------------------------------------------------------------------------

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

   7 - access("SALES"."PROD_ID"=100)


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
         44  consistent gets
          0  physical reads
          0  redo size
        559  bytes sent via SQL*Net to client
        512  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
0rows processed

指定索引的指示INDEX(table_name [index_name]),如果不指定索引名,表示访问这个表要使用索引。
HR@ prod> create table employees1 as select * from employees ;
create table employees1 as select * from employees
             *
ERROR at line 1:
ORA-00955: name is already used by an existing object


HR@ prod> create index test_idx1 on employees1 ( employee_id ) ;

Index created.

HR@ prod> create index test_idx2 on employees1 ( employee_id , first_name ) ;

Index created.

Oracle在默认的情况下当然会使用单列索引,而不用复合索引。
HR@ prod> select last_name from employees1 where employee_id = 100 ;

LAST_NAME
-------------------------
King


Execution Plan
----------------------------------------------------------
Plan hash value: 2613790398

------------------------------------------------------------------------------------------
| Id  | Operation                   | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |            |     1 |    11 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| EMPLOYEES1 |     1 |    11 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | TEST_IDX1  |     1 |       |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------------

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

   2 - access("EMPLOYEE_ID"=100)


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
          3  consistent gets
          0  physical reads
          0  redo size
        529  bytes sent via SQL*Net to client
        523  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

下面这种只指定索引的写法是错的,会被优化器忽略。
HR@ prod> select /*+ index(test_idx2) */ last_name from employees1 where employee_id = 100 ;

LAST_NAME
-------------------------
King


Execution Plan
----------------------------------------------------------
Plan hash value: 2613790398

------------------------------------------------------------------------------------------
| Id  | Operation                   | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |            |     1 |    11 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| EMPLOYEES1 |     1 |    11 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | TEST_IDX1  |     1 |       |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------------

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

   2 - access("EMPLOYEE_ID"=100)


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
          3  consistent gets
          0  physical reads
          0  redo size
        529  bytes sent via SQL*Net to client
        523  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

正确的写法
HR@ prod> select /*+ index(employees1 test_idx2) */ last_name from employees1 where employee_id = 100 ;

LAST_NAME
-------------------------
King


Execution Plan
----------------------------------------------------------
Plan hash value: 2093088777

------------------------------------------------------------------------------------------
| Id  | Operation                   | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |            |     1 |    11 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| EMPLOYEES1 |     1 |    11 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | TEST_IDX2  |     1 |       |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------------

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

   2 - access("EMPLOYEE_ID"=100)


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
          3  consistent gets
          0  physical reads
          0  redo size
        529  bytes sent via SQL*Net to client
        523  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
1rows processed

常见的联结提示:
Use_merge()
Use_ln()
Use_hash()
Leading()
使用提示时要注意,如果表有别名,一定要用别名,否则提示无效。而且,表名一定不能有用户名来限制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值