外部联接"+"
Oracle总有一些突破标准SQL的新手段让人耳目一新,既考虑了效率,写起来又顺手,只是普通的开发人员往往想不起来用到它.
外部联接就是一种.此外,在后来的9i以上版本中还出现了几种极其有效的新手段,功能强大而书写又很简洁,留待下次整理后贴出.
外部联接其实早就出现了,但真正用到的有心人还是只占少数.当然,也不排除一些人是从移植性的角度去考虑而特地避开的情况.
外部联接"+"的概念与用法
外部联接"+"按其在"="的左边或右边分左联接和右联接.
若不带"+"运算符的表中的一个行不直接匹配于带"+"预算符的表中的任何行,则前者的行与后者中的一个空行相匹配并被返回.
若二者均不带"+",则二者中无法匹配的均被返回.
利用外部联接"+",可以替代效率十分低下的 not in 运算,大大提高运行速度.
若不带"+"运算符的表中的一个行不直接匹配于带"+"预算符的表中的任何行,则前者的行与后者中的一个空行相匹配并被返回.
若二者均不带"+",则二者中无法匹配的均被返回.
利用外部联接"+",可以替代效率十分低下的 not in 运算,大大提高运行速度.
举出实例最说明问题——
例如,下面这条命令执行起来很慢
用外部联接提高表连接的查询速度
在作表连接(常用于视图)时,常使用以下方法来查询数据:
在作表连接(常用于视图)时,常使用以下方法来查询数据:
SELECT PAY_NO, PROJECT_NAME
FROM A
WHERE A.PAY_NO NOT IN (SELECT PAY_NO FROM B WHERE VALUE >=120000);
FROM A
WHERE A.PAY_NO NOT IN (SELECT PAY_NO FROM B WHERE VALUE >=120000);
---- 如果表A有10000条记录,表B有10000条记录,在我的01年的老PC上要用掉差不多30分钟多一点,
因为 NOT IN 要进行一条一条的比较,共需要10000*10000 次比较后,才能得到结果。改用外部联接,可大大缩短查询时间,我机子上测试为1分左右:
SELECT PAY_NO, PROJECT_NAME
FROM A,B
WHERE A.PAY_NO=B.PAY_NO(+)
AND B.PAY_NO IS NULL
AND B.VALUE >=12000;
FROM A,B
WHERE A.PAY_NO=B.PAY_NO(+)
AND B.PAY_NO IS NULL
AND B.VALUE >=12000;
又比如:
select a.empno from emp a where a.empno not in
(select empno from emp1 where job=’SALE’);
(select empno from emp1 where job=’SALE’);
若利用外部联接,改写命令如下:
select a.empno from emp a ,emp1 b
where a.empno=b.empno(+)
and b.empno is null
and b.job='SALE';
where a.empno=b.empno(+)
and b.empno is null
and b.job='SALE';
可以发现,运行速度明显提高.
其实,如果从算法的复杂度分析也可以明显看出外部联接的好处,
相当于接近减少了一个维,例如10000*10000次,现在其中的一个10000变成个位数,复杂度数量级很快就下来了。
在应用中从效率出发注意这些工具的使用,对未来系统上线应用的性能提高会有很大的帮助。就好象你对oracle好,oracle也会对你好!
转载于:https://blog.51cto.com/77857/179916