Oracle外聯接用法(轉)

BSDLite發表於2007-08-16
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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章