SWAP_JOIN_INPUTS甲骨文提示

  

swap_join_inputs是针对哈希连接的提示,它的含义是让优化器交换原哈希连接的驱动表和被驱动表的顺序,即在依然走哈希连接的情况下让原哈希连接的驱动表变被驱动表,让原哈希连接的被驱动表变为驱动表。

注意,在swap_join_inputs提示中指定的目标表应该是原哈希连接中的被驱动表,否则oracle会忽略该提示。

/* + swap_join_inputs(原哈希连接的被驱动表)*/

其使用范例如下:

select /* +,领导(部门),use_hash (emp), swap_join_intputs (emp), */, *,得到emp, dept    emp.deptno=dept.deptno

测试案例:

SCOTT@ORA12C>, create  table  t1  as  select  *,得到dba_objects  where  rownum<2;   Table 创建。   SCOTT@ORA12C>, create  table  t2  as  select  *,得到dba_objects  where  rownum<12;   Table 创建。   SCOTT@ORA12C>, create  table  t3  as  select  *,得到dba_objects  where  rownum<22;   Table 创建。

收集统计信息:

SCOTT@ORA12C>, exec  dbms_stats.gather_table_stats (ownname =祝辞,斯科特,tabname =祝辞,T1, estimate_percent =祝辞,100年,cascade =祝辞,真的,method_opt =祝辞,“for  all  columns  size  1 ', no_invalidate =祝辞,假);   PL/SQL  procedure  successfully 完成。   SCOTT@ORA12C>, exec  dbms_stats.gather_table_stats (ownname =祝辞,斯科特,tabname =祝辞,T2, estimate_percent =祝辞,100年,cascade =祝辞,真的,method_opt =祝辞,“for  all  columns  size  1 ', no_invalidate =祝辞,假);   PL/SQL  procedure  successfully 完成。   SCOTT@ORA12C>, exec  dbms_stats.gather_table_stats (ownname =祝辞,斯科特,tabname =祝辞,T3, estimate_percent =祝辞,100年,cascade =祝辞,真的,method_opt =祝辞,“for  all  columns  size  1 ', no_invalidate =祝辞,假);   PL/SQL  procedure  successfully 完成。

3个表的记录如下:

SCOTT@ORA12C>, select  count(*),得到t1;   ,COUNT (*)   -----------------   1   1,row 选中。   SCOTT@ORA12C>, select  count(*),得到t2;   ,COUNT (*)   -----------------   ,,,,,,11   1,row 选中。   SCOTT@ORA12C>, select  count(*),得到t3;   ,COUNT (*)   -----------------   ,,,,,,21岁   1,row 选中。

现在我们来让表T2和T3做哈希连接,由于T3表的记录数比T2表的记录数多,所以这里指定T3为哈希连接的被驱动表:

select /* +, ordered  use_hash (T3), */, t2.object_name t3.object_type   2,才能,得到t2, t3  where  t2.object_id=t3.object_id;   Execution 计划   ----------------------------------------------------------   Plan  hash 值:1730954469   ---------------------------------------------------------------------------   | |,Id 还以为;Operation ,, |, Name  |, Rows , |, Bytes  |, Cost  (% CPU) |, Time  |   ---------------------------------------------------------------------------   |,,,0,|,SELECT  STATEMENT ,, |,, |,,,, 11, |,,, 220, | 6,,, (0) |, 00:00:01  |   | *,,1,|,,HASH  JOIN ,, |,, |,,,, 11, |,,, 220, | 6,,, (0) |, 00:00:01  |   |,,,2,|,,,TABLE  ACCESS 全部|,T2 ,, |,,,, 11, |,,, 110, | 3,,, (0) |, 00:00:01  |   |,,,3,|,,,TABLE  ACCESS 全部|,T3 ,, |,,,, 21, |,,, 210, | 3,,, (0) |, 00:00:01  |   ---------------------------------------------------------------------------   Predicate 方式;(identified  by  operation  id):   ---------------------------------------------------   ,,1,安康;访问(“T2”。“OBJECT_ID”=癟3”。“OBJECT_ID”)

可以看的到,上述SQL的执行计划现在走的是哈希连接,并且被驱动表示表T3。

如果我们想让哈希连接的被驱动表由T3变成T2,可以在上述sql加入swap_join_inputs提示:

select /* +, ordered  use_hash (T3), swap_join_inputs (T3), */, t2.object_name t3.object_type   2,才能,得到t2, t3  where  t2.object_id=t3.object_id;   Execution 计划   ----------------------------------------------------------   Plan  hash 值:1723280936   ---------------------------------------------------------------------------   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

SWAP_JOIN_INPUTS甲骨文提示