nested loop比hash join慢

今天遇见个诡异为题,情况是这样的

我有一个sql,在分页查询 为20条的时候,查询结果为100多ms,但是当分页查询为10条时,执行时间多达4000ms,最后通过执行计划发现,唯一差别是:

10条时,使用的是nested loop;

20条时,用的是hash join;

最后只有强制oracle使用 hash join。具体 nested loop与hash join区别就不多说了

/*+ USE_HASH(t,u) */

 解决了此问题 其中t和u分别是视图名或子查询的别名。sql类似如下

select b.*
  from (select a.*, rownum as rownumA
          from (
          
                select /*+ USE_HASH(t,u) */
                 u.name, t.name, t.aNums
                  from (select count(a) as aNums, s.name, s.uid
                           from sur s
                          group by s.name, s.uid) t
                 inner join v_user u
                    on u.id = t.uid

                    ) a
         where rownum <= 10
        ) b
 where rownumA >= 1

开始把USE_HASH(t,u) 加到最外层select后面,结果不行。必须加到关联查询数据的 select后

猜你喜欢

转载自lyjilu.iteye.com/blog/1977860