今天遇见个诡异为题,情况是这样的
我有一个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后