问题:
我现在有2个表(Table1, Table2),表一有两个整型字段(A1,A2),表2有一个整型字段B1,要求查出全部满足条件的(A1,B1)对,并按B1进行排序。条件为A1和B1都大于0,且A1<B1, 且A1+A2>B1。两个表各有8万条,我现在要用6分钟,太慢了,请帮助改进。
我的SQL语句:
select A1, B1
from Table1, Table2
where A1 > 0
and B1 > A1
and B1 < A1+ A2
order by B1;
我已经对A1,B1建了索引。
我现在有2个表(Table1, Table2),表一有两个整型字段(A1,A2),表2有一个整型字段B1,要求查出全部满足条件的(A1,B1)对,并按B1进行排序。条件为A1和B1都大于0,且A1<B1, 且A1+A2>B1。两个表各有8万条,我现在要用6分钟,太慢了,请帮助改进。
我的SQL语句:
select A1, B1
from Table1, Table2
where A1 > 0
and B1 > A1
and B1 < A1+ A2
order by B1;
我已经对A1,B1建了索引。
from Table1, Table2
where A1 > 0
and B1 > A1
and B1 < A1+ A2
order by B1; 修改成:select * from table1 a
where exists(select * from table2 b where b.B1>a.A1 and b.B1<a.A1+a.A2)
and A1>0
这样只能返回table1的信息,我要的是全部满足条件的(A1,B1)对
select A1, B1
from Table2,Table1
where B1 between A1 AND A1+ A2
AND A1>0
order by B1;
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理。 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。当ORACLE处理多个表时, 会运用排序及合并的方式连接它们。首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并。
例如:
表 TAB1 16,384 条记录
表 TAB2 1 条记录
选择TAB2作为基础表 (最好的方法)
select count(*) from tab1,tab2 执行时间0.96秒
选择TAB2作为基础表 (不佳的方法)
select count(*) from tab2,tab1 执行时间26.09秒
如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表。
例如:
(低效,执行时间156.3秒)
SELECT …
FROM EMP E
WHERE SAL > 50000
AND JOB = ‘MANAGER’
AND 25 < (SELECT COUNT(*) FROM EMP
WHERE MGR=E.EMPNO);
(高效,执行时间10.6秒)
SELECT …
FROM EMP E
WHERE 25 < (SELECT COUNT(*) FROM EMP
WHERE MGR=E.EMPNO)
AND SAL > 50000
AND JOB = ‘MANAGER’;
B1 between A1 AND A1+ A2 得改成 B1 between A1+1 AND A1+ A2-1
但这样测试后并没有提高速度
结果索引没能过滤多少数据,反而增加了ioTable2(A1,A2)建个索引试试能