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 nullSWAP_JOIN_INPUTS甲骨文提示