Oracle外联接用法(转)

Oracle外联接用法(转)[@more@]外部联接"+"
  Oracle总有一些突破标准SQL的新手段让人耳目一新,既考虑了效率,写起来又顺手,只是普通的开发人员往往想不起来用到它.
  外部联接就是一种.此外,在后来的9i以上版本中还出现了几种极其有效的新手段,功能强大而书写又很简洁,留待下次整理后贴出.
  外部联接其实早就出现了,但真正用到的有心人还是只占少数.当然,也不排除一些人是从移植性的角度去考虑而特地避开的情况.

外部联接"+"的概念与用法
  外部联接"+"按其在"="的左边或右边分左联接和右联接.
  若不带"+"运算符的表中的一个行不直接匹配于带"+"预算符的表中的任何行,则前者的行与后者中的一个空行相匹配并被返回.
  若二者均不带"+",则二者中无法匹配的均被返回.
  利用外部联接"+",可以替代效率十分低下的 not in 运算,大大提高运行速度.

  举出实例最说明问题——
  例如,下面这条命令执行起来很慢
  用外部联接提高表连接的查询速度
  在作表连接(常用于视图)时,常使用以下方法来查询数据:
SELECT PAY_NO, PROJECT_NAME
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;

又比如:
select a.empno from emp a where a.empno not in
(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';
可以发现,运行速度明显提高.

  其实,如果从算法的复杂度分析也可以明显看出外部联接的好处,相当于接近减少了一个维,例如10000*10000次,现在其中的一个10000变成个位数,复杂度数量级很快就下来了。
  在应用中从效率出发注意这些工具的使用,对未来系统上线应用的性能提高会有很大的帮助。就好象你对oracle好,oracle也会对你好!

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10617542/viewspace-961530/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10617542/viewspace-961530/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值