ITPub博客

首页 > 数据库 > Oracle > Oracle优化器之use_hash深度解密

Oracle优化器之use_hash深度解密

原创 Oracle 作者:tompson666 时间:2024-05-19 00:12:40 0 删除 编辑
/+ use_hash(t) */
--t作为被驱动表,外表
swap_join_inputs是针对哈希连接的hint,让优化器交换原哈希连接的驱动表和被驱动表的顺序,即在依然走哈希连接的情况下让原哈希连接的驱动表变被驱动表,让原哈希连接的被驱动表变为驱动表。leading/orderd可代替
swap_join_inputs(emp@a) 
swap_join_inputs(原被驱动表-) 
--hash jion,小表作为驱动表,控制连接顺序
select e.ename,d.dname from emp e,dept d where e.deptno=d.deptno and d.loc='BOSTON';
select * from dept d,emp e where d.deptno=e.deptno;
select /*+ leading(d) use_hash(e) */  * from dept d,emp e where d.deptno=e.deptno;
Execution Plan
----------------------------------------------------------
Plan hash value: 615168685
---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     5 |   250 |     7  (15)| 00:00:01 |
|*  1 |  HASH JOIN         |      |     5 |   250 |     7  (15)| 00:00:01 |
|*  2 |   TABLE ACCESS FULL| DEPT |     1 |    30 |     3   (0)| 00:00:01 |            -->驱动表(outer table)
|   3 |   TABLE ACCESS FULL| EMP  |    14 |   280 |     3   (0)| 00:00:01 |            -->e被驱动表
---------------------------------------------------------------------------
============
Plan Table
============
--------------------------------------+-----------------------------------+
| Id  | Operation           | Name    | Rows  | Bytes | Cost  | Time      |
--------------------------------------+-----------------------------------+
| 0   | SELECT STATEMENT    |         |       |       |     7 |           |
| 1   |  HASH JOIN          |         |    14 |  1638 |     7 |  00:00:01 |
| 2   |   TABLE ACCESS FULL | DEPT    |     4 |   120 |     3 |  00:00:01 |
| 3   |   TABLE ACCESS FULL | EMP     |    14 |  1218 |     3 |  00:00:01 |
--------------------------------------+-----------------------------------+
select /*+ leading(e) use_hash(d) swap_join_inputs(e)*/  * from dept d,emp e where d.deptno=e.deptno(+);
--
SQL> select /*+ use_hash(dept,emp@a) leading(emp@a) */ * from dept
where not exists
(select /*+ qb_name(a) */ null from emp where emp.deptno = dept.deptno);
  2    3  
Elapsed: 00:00:00.03
Execution Plan
----------------------------------------------------------
Plan hash value: 474461924
---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     4 |   172 |     7  (15)| 00:00:01 |
|*  1 |  HASH JOIN ANTI    |      |     4 |   172 |     7  (15)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| DEPT |     4 |   120 |     3   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| EMP  |    14 |   182 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------
==========================================================================================
select /*+ use_hash(dept,emp@a) swap_join_inputs(emp@a) leading(emp@a) */ * from dept
where not exists
(select /*+ qb_name(a) */ null from emp where emp.deptno = dept.deptno);
---
SQL> select /*+ use_hash(dept,emp@a) swap_join_inputs(emp@a) leading(emp@a) */ * from dept
where not exists
(select /*+ qb_name(a) */ null from emp where emp.deptno = dept.deptno);  2    3  
Elapsed: 00:00:00.42
Execution Plan
----------------------------------------------------------
Plan hash value: 152508289
-----------------------------------------------------------------------------
| Id  | Operation            | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |      |     4 |   172 |     7  (15)| 00:00:01 |
|*  1 |  HASH JOIN RIGHT ANTI|      |     4 |   172 |     7  (15)| 00:00:01 |
|   2 |   TABLE ACCESS FULL  | EMP  |    14 |   182 |     3   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL  | DEPT |     4 |   120 |     3   (0)| 00:00:01 |
-----------------------------------------------------------------------------


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70038077/viewspace-3015904/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: PG高可用技巧
下一篇: Oracle Redo优化
请登录后发表评论 登录
全部评论
Oracle ACE PostgreSQL ACE PG/MySQL内核技术推广者 著有《Oracle高性能自动化运维》 目前致力于Oracle/MySQL/PG技术推广&信创项目交付&最佳实践探索。公众号:dba悠然

注册时间:2024-04-14

  • 博文量
    42
  • 访问量
    33732