小弟目前遇到一个比较棘手的问题,是这样的:
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实现,十分钟之内可以搞定,但是很麻烦,还是希望能够在数据库里面解决这个问题.希望各路高手不吝赐教,小弟感激不尽!
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实现,十分钟之内可以搞定,但是很麻烦,还是希望能够在数据库里面解决这个问题.希望各路高手不吝赐教,小弟感激不尽!
--分别给这两个字段建索引 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;
试试下面的
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;