1:ordered  
就是表示根据 from 后面表的顺序join,从左到右,左边的表做驱动表。连接方式是 HASH JOIN
2:use_nl()
use_nl(t1)如果只带了一个表名作为参数,则该表为被驱动表,连接方式是    HASH JOIN
use_nl(t1,t2)表示对表t1、t2关联时采用嵌套循环连接     NESTED LOOPS
但是并不能让优化器确定谁是驱动表或谁是被驱动的表
3:leading()
leading(t1) 指定t1为驱动表              连接方式是 HASH JOIN

单独使用
select /*+ ordered*/* from t1,t2 where t1.a=t.a;
ordered制定了t1为驱动表     连接方式  HASH JOIN

select /*+   use_nl(t1,t2)*/* from t1,t2 where t1.a=t.a;
use_ul(t1,t2)指定了这2个表连接方式为     NESTED LOOPS
搭配使用:
select /*+ ordered  use_nl(t1,t2)*/* from t1,t2 where t1.a=t.a;
ordered  指定了t1为驱动表,use_ul(t1,t2)指定了2各表连接方式为     NESTED LOOPS

select /*+ ordered  use_nl(t2)*/* from t1,t2 where t1.a=t.a;
ordered  指定了t1为驱动表,use_ul(t2)指定了t2为被驱动表(没有冲突)
表连接方式为      NESTED LOOPS

select /*+ ordered  use_nl(t1)*/* from t1,t2 where t1.a=t.a;
ordered  指定了t1为驱动表,use_ul(t1)指定了t1为被驱动表(有冲突)
所以oracle 忽视这个hint,   表连接方式为     HASH JOIN


select /*+ leading(t1)  use_nl(t2)*/* from t1,t2 where t1.a=t.a;
leading(t1)  指定了t1为驱动表,use_ul(t2)指定了t2为被驱动表(没有冲突)
连接方式为      NESTED LOOPS

select /*+ leading(t1) use_nl(t1)*/* from t1,t2 where t1.a=t.a;
leading(t1)指定了t1为驱动表,use_ul(t1)指定了t1为被驱动表(有冲突)
所以oracle 忽视这个hint,   表连接方式为     HASH JOIN

1./*+use_nl(t2,t) */ 提示走nest loop,但没有提示t2还是t为驱动表 。
2./*+ ordered use_nl(t2,t) */提示走nest loop,order提示的是from后面的第一个表为驱动表。
3./*+ leading(t2) use_nl(t) */ 直接提示t2为驱动表。
结论:use_nl不能让优化器确定谁是驱动表谁是被驱动的表,use_nl(t,t2)也没有指出哪个是驱动表,这时候我们需要使用ordered,leading来强制指定驱动表,以达到我们的目的。