小弟目前遇到一个比较棘手的问题,是这样的:
A表
col1  col2
A      2
B      4
C      7
D      9
......B表
col1
3
5
8
10
12
......A.B2表的数字都是随机的,B表数据不重复,现在要求出A表中每个数据匹配到的B表中比该数据大的最小值,结果如下:
col1  col2  col3
A      2       3
B      4       5
C      7       8
D      9       10
...... 目前已用sql可以实现这一功能,select a.col1,a.col2,min(b.col1) from a join b on a.col2 <= b.col1 group by a.col1,a.col2;
现在的问题是,A表数据有50W,B表有400W,这2表关联走的是sort merge join,效率非常低,oracle根本承受不住,请问有什么好的方法么?
尝试过把数据导成文本用shell实现,十分钟之内可以搞定,但是很麻烦,还是希望能够在数据库里面解决这个问题.希望各路高手不吝赐教,小弟感激不尽!

解决方案 »

  1.   

    --b join a
    --分别给这两个字段建索引 a.col2,b.col1 试试
    select a.col1,a.col2,min(b.col1) from b join a on a.col2 <= b.col1 group by a.col1,a.col2;
      

  2.   

    b表建索引应该就可以了.a表是必定走fts的.
    试试下面的
    SQL> create table t_a
      2  (col1 number,
      3   col2 number);
     
    Table created
     
    SQL> 
    SQL> create table t_b
      2  (col1 number);
     
    Table created
     
    SQL> insert into t_a
      2  select rownum,rownum from dual connect by rownum<=410000;
     
    410000 rows inserted
     
    SQL> insert into t_b
      2  select rownum from dual connect by rownum<=4110000;
     
    4110000 rows inserted
     
    SQL> create index idx_t_b on t_b(col1);
     
    Index created
     
    SELECT a.col1,
           a.col2,
           (SELECT MIN(b.col1) FROM t_b b WHERE a.col2 < b.col1) col3
      FROM t_a a;
      

  3.   

    谢LS的,我试了下建索引然后用相关子查询,果然比直接2表关联要快的多,走的是INDEX RANGE SCAN,而且少了一步group by的操作,基本上几秒钟就出结果了,非常感谢!