Oracle Hint 学习之三
admin
2023-05-07 17:42:07
0

与表连接顺序的相关hint:

执行顺序emp-jobs-dept

SQL> select /*+ ordered */e.ename,j.job,e.sal,d.deptno from emp e,jobs j,dept d where e.empno=j.empno and e.deptno=d.deptno and d.loc='CHICAGO' order by e.ename;
6 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 477715418
-----------------------------------------------------------------------------------------------
| Id  | Operation       | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |      |     5 |   235 |     9  (23)| 00:00:01 |
|   1 |  SORT ORDER BY       |      |     5 |   235 |     9  (23)| 00:00:01 |
|*  2 |   HASH JOIN       |      |     5 |   235 |     8  (13)| 00:00:01 |
|   3 |    MERGE JOIN       |      |    14 |   504 |     6  (17)| 00:00:01 |
|   4 |     TABLE ACCESS BY INDEX ROWID| EMP      |    14 |   238 |     2(0)| 00:00:01 |
|   5 |      INDEX FULL SCAN       | PK_EMP       |    14 |       |     1(0)| 00:00:01 |
|*  6 |     SORT JOIN       |      |    14 |   266 |     4  (25)| 00:00:01 |
|   7 |      TABLE ACCESS FULL       | JOBS      |    14 |   266 |     3(0)| 00:00:01 |
|   8 |    TABLE ACCESS BY INDEX ROWID | DEPT      |     1 |    11 |     2(0)| 00:00:01 |
|*  9 |     INDEX RANGE SCAN       | IDX_DEPT_LOC |     1 |       |     1(0)| 00:00:01 |
-----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("E"."DEPTNO"="D"."DEPTNO")
   6 - access("E"."EMPNO"="J"."EMPNO")
       filter("E"."EMPNO"="J"."EMPNO")
   9 - access("D"."LOC"='CHICAGO')
Note
-----
   - dynamic sampling used for this statement (level=2)
Statistics
----------------------------------------------------------
  0  recursive calls
  0  db block gets
  7  consistent gets
  0  physical reads
  0  redo size
898  bytes sent via SQL*Net to client
523  bytes received via SQL*Net from client
  2  SQL*Net roundtrips to/from client
  2  sorts (memory)
  0  sorts (disk)
  6  rows processed

修改from后表的顺序:执行顺序变成emp-dept-jobs

SQL> select /*+ ordered */e.ename,j.job,e.sal,d.deptno from emp e,dept d,jobs j where e.empno=j.empno and e.deptno=d.deptno and d.loc='CHICAGO' order by e.ename;
6 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 3709357593
------------------------------------------------------------------------------------------------
| Id  | Operation| Name       | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT|       |     5 |   235 |     9(23)| 00:00:01 |
|   1 |  SORT ORDER BY|       |     5 |   235 |     9(23)| 00:00:01 |
|*  2 |   HASH JOIN|       |     5 |   235 |     8(13)| 00:00:01 |
|   3 |    MERGE JOIN|       |     5 |   140 |     5(20)| 00:00:01 |
|   4 |     TABLE ACCESS BY INDEX ROWID | EMP       |    14 |   238 |     2 (0)| 00:00:01 |
|   5 |      INDEX FULL SCAN| IDX_EMP_DEPT |    14 |       |     1 (0)| 00:00:01 |
|*  6 |     SORT JOIN|       |     1 |    11 |     3(34)| 00:00:01 |
|   7 |      TABLE ACCESS BY INDEX ROWID| DEPT       |     1 |    11 |     2 (0)| 00:00:01 |
|*  8 |       INDEX RANGE SCAN| IDX_DEPT_LOC |     1 |       |     1 (0)| 00:00:01 |
|   9 |    TABLE ACCESS FULL| JOBS       |    14 |   266 |     3 (0)| 00:00:01 |
------------------------------------------------------------------------------------------------

Leading hint:是针对多个目标表的hint,它的含义是让优化器将我们指定的多个表的连接结果作为目标sql表连接过程中的驱动结果集,并且将leading hint中从左到右出现的第一个目标表作为整个表连接过程中的首个驱动表:(emp_temp--emp--dept-jobs)对于没有指定的,优化器可以调整,而ordered表连接顺序被指定死了。

SQL> select /*+ leading(t e) */e.ename,j.job,e.sal,d.deptno from emp e,jobs j,dept d,emp_temp t where e.empno=j.empno and e.deptno=d.deptno and e.ename=t.ename and d.loc='CHICAGO' order by e.ename;
6 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 3130730953
-----------------------------------------------------------------------------------------------
| Id  | Operation       | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |      |     5 |   270 |    12(9)| 00:00:01 |
|   1 |  SORT ORDER BY       |      |     5 |   270 |    12(9)| 00:00:01 |
|*  2 |   HASH JOIN       |      |     5 |   270 |    11(0)| 00:00:01 |
|*  3 |    HASH JOIN       |      |     5 |   175 |     8(0)| 00:00:01 |
|*  4 |     HASH JOIN       |      |    14 |   336 |     6(0)| 00:00:01 |
|   5 |      TABLE ACCESS FULL       | EMP_TEMP     |    14 |    98 |     3(0)| 00:00:01 |
|   6 |      TABLE ACCESS FULL       | EMP      |    14 |   238 |     3(0)| 00:00:01 |
|   7 |     TABLE ACCESS BY INDEX ROWID| DEPT      |     1 |    11 |     2(0)| 00:00:01 |
|*  8 |      INDEX RANGE SCAN       | IDX_DEPT_LOC |     1 |       |     1(0)| 00:00:01 |
|   9 |    TABLE ACCESS FULL       | JOBS      |    14 |   266 |     3(0)| 00:00:01 |
-----------------------------------------------------------------------------------------------

USE_MERGE:中指定的目标表应该是排序合并连接的中的被驱动表:

SQL> select /*+ use_merge(e) */ * from emp e,dept d where e.deptno=d.deptno;
14 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 4082513813
---------------------------------------------------------------------------------------------
| Id  | Operation     | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |    | 14 |812 |  6  (17)| 00:00:01 |
|   1 |  MERGE JOIN     |    | 14 |812 |  6  (17)| 00:00:01 |
|   2 |   TABLE ACCESS BY INDEX ROWID| EMP    | 14 |532 |  2   (0)| 00:00:01 |
|   3 |    INDEX FULL SCAN     | IDX_EMP_DEPT | 14 |    |  1   (0)| 00:00:01 |
|*  4 |   SORT JOIN     |    |  4 | 80 |  4  (25)| 00:00:01 |
|   5 |    TABLE ACCESS FULL     | DEPT    |  4 | 80 |  3   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------
SQL> select /*+ use_merge(e j d t) */e.ename,j.job,e.sal,d.deptno from emp e,jobs j,dept d,emp_temp t where e.empno=j.empno and e.deptno=d.deptno and e.ename=t.ename and d.loc='CHICAGO' order by e.ename;
6 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 2730522951
--------------------------------------------------------------------------------------------------
| Id  | Operation  | Name | Rows  | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  | |     5 |   270 |    15  (34)| 00:00:01 |
|   1 |  MERGE JOIN  | |     5 |   270 |    15  (34)| 00:00:01 |
|   2 |   SORT JOIN  | |     5 |   235 |    11  (37)| 00:00:01 |
|   3 |    MERGE JOIN  | |     5 |   235 |    10  (30)| 00:00:01 |
|   4 |     SORT JOIN  | |     5 |   140 |     6  (34)| 00:00:01 |
|   5 |      MERGE JOIN   | |     5 |   140 |     5  (20)| 00:00:01 |
|   6 |       TABLE ACCESS BY INDEX ROWID | EMP  |    14 |   238 |     2   (0)| 00:00:01 |
|   7 |        INDEX FULL SCAN  | IDX_EMP_DEPT |    14 | |     1   (0)| 00:00:01 |
|*  8 |       SORT JOIN   | |     1 |    11 |     3  (34)| 00:00:01 |
|   9 |        TABLE ACCESS BY INDEX ROWID| DEPT |     1 |    11 |     2   (0)| 00:00:01 |
|* 10 | INDEX RANGE SCAN  | IDX_DEPT_LOC |     1 | |     1   (0)| 00:00:01 |
|* 11 |     SORT JOIN  | |    14 |   266 |     4  (25)| 00:00:01 |
|  12 |      TABLE ACCESS FULL  | JOBS |    14 |   266 |     3   (0)| 00:00:01 |
|* 13 |   SORT JOIN  | |    14 |    98 |     4  (25)| 00:00:01 |
|  14 |    TABLE ACCESS FULL  | EMP_TEMP |    14 |    98 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------

与之对应的no_use_merge:

SQL> select /*+ ordered no_use_merge(d) */ * from emp e,dept d where e.deptno=d.deptno;
14 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 1123238657
---------------------------------------------------------------------------
| Id  | Operation   | Name | Rows  | Bytes | Cost (%CPU)| Time  |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |  |    14 |   812 |6   (0)| 00:00:01 |
|*  1 |  HASH JOIN   |  |    14 |   812 |6   (0)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| EMP  |    14 |   532 |3   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| DEPT |4 |    80 |3   (0)| 00:00:01 |
---------------------------------------------------------------------------

USE_NL:

SQL> select /*+ use_nl(e,j, d, t) */e.ename,j.job,e.sal,d.deptno from emp e,jobs j,dept d,emp_temp t where e.empno=j.empno and e.deptno=d.deptno and e.ename=t.ename and d.loc='CHICAGO' order by e.ename;
6 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 4019883924
------------------------------------------------------------------------------------------------
| Id  | Operation| Name       | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT|       |     5 |   270 |    18 (6)| 00:00:01 |
|   1 |  SORT ORDER BY|       |     5 |   270 |    18 (6)| 00:00:01 |
|   2 |   NESTED LOOPS|       |     5 |   270 |    17 (0)| 00:00:01 |
|   3 |    NESTED LOOPS |       |     5 |   175 |    10 (0)| 00:00:01 |
|   4 |     NESTED LOOPS|       |     5 |   140 |     3 (0)| 00:00:01 |
|   5 |      TABLE ACCESS BY INDEX ROWID| DEPT       |     1 |    11 |     2 (0)| 00:00:01 |
|*  6 |       INDEX RANGE SCAN| IDX_DEPT_LOC |     1 |       |     1 (0)| 00:00:01 |
|   7 |      TABLE ACCESS BY INDEX ROWID| EMP       |     5 |    85 |     1 (0)| 00:00:01 |
|*  8 |       INDEX RANGE SCAN| IDX_EMP_DEPT |     5 |       |     0 (0)| 00:00:01 |
|*  9 |     TABLE ACCESS FULL| EMP_TEMP     |     1 |     7 |     1 (0)| 00:00:01 |
|* 10 |    TABLE ACCESS FULL| JOBS       |     1 |    19 |     1 (0)| 00:00:01 |
------------------------------------------------------------------------------------------------

USE_HASH:

SQL> select /*+ ordered use_hash(e,j, d, t) */e.ename,j.job,e.sal,d.deptno from emp e,jobs j,dept d,emp_temp t where e.empno=j.empno and e.deptno=d.deptno and e.ename=t.ename and d.loc='CHICAGO' order by e.ename;

6 rows selected.

Execution Plan

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

Plan hash value: 3131502444

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

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

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

|   0 | SELECT STATEMENT       |      |     5 |   270 |    12 (9)| 00:00:01 |

|   1 |  SORT ORDER BY       |      |     5 |   270 |    12 (9)| 00:00:01 |

|*  2 |   HASH JOIN       |      |     5 |   270 |    11 (0)| 00:00:01 |

|*  3 |    HASH JOIN       |      |     5 |   235 |     8 (0)| 00:00:01 |

|*  4 |     HASH JOIN       |      |    14 |   504 |     6 (0)| 00:00:01 |

|   5 |      TABLE ACCESS FULL       | EMP      |    14 |   238 |     3 (0)| 00:00:01 |

|   6 |      TABLE ACCESS FULL       | JOBS      |    14 |   266 |     3 (0)| 00:00:01 |

|   7 |     TABLE ACCESS BY INDEX ROWID| DEPT      |     1 |    11 |     2 (0)| 00:00:01 |

|*  8 |      INDEX RANGE SCAN       | IDX_DEPT_LOC |     1 |       |     1 (0)| 00:00:01 |

|   9 |    TABLE ACCESS FULL       | EMP_TEMP     |    14 |    98 |     3 (0)| 00:00:01 |

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

加入ordered hint可以走出自己想要的执行计划


相关内容

热门资讯

武汉大学打开大门,以开放拆掉“... 澎湃新闻主笔 沈彬5月13日,武汉大学正式取消社会公众进校预约制度。公众无需任何预约,仅凭本人身份证...
中方很直白:对欧洲非常失望,把... 【文/观察者网 柳白】欧盟屡借“安全风险”和“产业振兴”之名,行保护主义与差别对待之实,遭中方明确回...
韩国赚大了,但大麻烦也来了 AI正在改变世界,但不得不说,最先被深刻重塑、掀起财富狂潮的,还是韩国。有些数据,说出来都不敢相信自...
以色列执政联盟提交提前解散议会... 以色列执政联盟主席奥菲尔·卡茨13日与联盟各派别领导人共同提交一项解散议会的议案,此举可能触发以色列...
内塔尼亚胡首次公开证实曾秘访,... 以色列总理办公室13日证实,以总理内塔尼亚胡在以色列对伊朗发动大规模军事行动期间曾秘密访问阿联酋,并...
1万个外资项目,看好这个县级市 在昆山高新区的沪士电子股份有限公司门口,运输建材的卡车与满载成品的物流货车交错而行。新厂房扩建与车间...
特朗普抵达酒店,车队驶过持续6... 美国总统特朗普车队于5月13日晚8点30分左右抵达位于北京东三环的下榻酒店。凤凰卫视驻北京记者在酒店...
少出国、少用油、少买金子,莫迪... 【文/观察者网 熊超然】上周末,印度总理莫迪呼吁民众在中东战争持续的这段时间里,未来一年内适度减少燃...
岛内“新地标”,沦为民进党“抢... 被视为岛内近年来最为重大的公共建设项目之一的新北市淡江大桥,于5月12日正式通车。然而,因民进党当局...
副秘书长在以色列机场遭扣留,联... 新华社联合国5月13日电 联合国秘书长副发言人哈克13日就联合国负责安全和安保事务的副秘书长吉勒·米...