先对FJFILE进行筛选查出子查询,即
select FILE_ID,FILE_NAME from FJFILE where TELATE_TABLE = 'FOODPRODUCT'
(筛选掉无用的列和记录是非常重要的~)然后用这个子查询的结果,与FOODPRODUCT 表联立~
(虽然不一定能达到你要的效果,但效果绝对是立杆见影)
整个sql改为:select *
from (select row_.*, rownum rownum_
from (select a.ID ,
a.UNIT ,
a.REGISTER_DATE ,
a.CHARACTER ,
a.DIRECTOR ,
a.ZGRS ,
a.CAPITAL ,
a.APPLY_ITEM ,
b.FILE_ID ,
b.FILE_NAME
from FOODPRODUCT a,
(select FILE_ID,FILE_NAME from FJFILE where TELATE_TABLE = 'FOODPRODUCT') b
where a.ID(+) = B.REELATE_ID
order by a.ID
) row_
where rownum <= 2000)
where rownum_ > 1900
select FILE_ID,FILE_NAME from FJFILE where TELATE_TABLE = 'FOODPRODUCT'
(筛选掉无用的列和记录是非常重要的~)然后用这个子查询的结果,与FOODPRODUCT 表联立~
(虽然不一定能达到你要的效果,但效果绝对是立杆见影)
整个sql改为:select *
from (select row_.*, rownum rownum_
from (select a.ID ,
a.UNIT ,
a.REGISTER_DATE ,
a.CHARACTER ,
a.DIRECTOR ,
a.ZGRS ,
a.CAPITAL ,
a.APPLY_ITEM ,
b.FILE_ID ,
b.FILE_NAME
from FOODPRODUCT a,
(select FILE_ID,FILE_NAME from FJFILE where TELATE_TABLE = 'FOODPRODUCT') b
where a.ID(+) = B.REELATE_ID
order by a.ID
) row_
where rownum <= 2000)
where rownum_ > 1900
select REELATE_ID,FILE_ID,FILE_NAME from FJFILE where TELATE_TABLE = 'FOODPRODUCT'
另外再试试把两个表的位置交换, 把where a.ID(+) = B.REELATE_ID两边交换.
(效果是不同的,我忘了应该把大表放在前,还是小表放在前?)
本人根据你的语句建立了两个表当没有建索引!
1外连接 计划:
0 全表扫描
0 全表扫描
1 HASH JOIN OUTER 2内连接
0 全表扫描
1 SORT JOIN
0 全表扫描
1 SORT JOIN
2 MERGE JOIN
200000条记录*60000条记录 = 120亿~
但如果先在60000中筛选记录(用这个筛选TELATE_TABLE = 'FOODPRODUCT'), 那么运气好的话,只剩下不到1000条记录, 而且列数量只剩下3个~ 再相乘,当然会加快咯~ 200000条记录*1000条记录 + 60000条记录浏览 = 2亿零6万~ 比上面相成的结果行数小了60倍,而且列也减少了这样速度哪有不快的道理?? (不过只用了0.1秒我是没想到~~)
主要是我只会写一种: a(+)=b,
outer join, inner join没学过,不会写