計算機學習積累

          ----轉載有理,轉載是想研究,想研究才會看,看了才會有感想,轉載后我有時會寫一些自己的感受
          數據加載中……

          ORACLE中NOT IN 的替代

          典型的查詢方式為:
          SELECT TITLE
          FROM BOOKSHELF
          WHERE TITLE NOT IN
          ????? (SELECT TITLE FROM BOOKSHELF_CHECKOUT)
          ORDER BY TITLE;

          如果BOOKSHELF_CHECKOUT很大的話,速度可能會很慢,因為ORACLE會在BOOKSHELF_CHECKOUT上執行一個時間密集型的全表掃描。

          oracle 中not in 效率不高

          一:
          使用外部連接
          SELECT DISTINCT C.TITLE
          FROM BOOKSHELF_CHECKOUT B RIGHT OUTER JOIN BOOKSHELF C
          ??? ON B.TITLE = C.TITLE
          WHERE B.TITLE IS NULL
          ORDER BY C.TITLE ;
          優化后的程序可以使用連接列上的索引。
          WHERE B.TITLE IS NULL
          表示不出現在BOOKSHELF_CHECKOUT中的TITLE列 (ORACLE作為NULL列返回,可參考外部連接方面的內容)
          二:
          使用NOT EXISTS
          SELECT B.TITLE
          FROM BOOKSHELF B
          WHERE NOT EXISTS
          ???? (SELECT 'X' FROM BOOKSHELF_CHECKOUT C
          ????? WHERE C.TITLE = B.TITLE)
          ORDER BY B.TITLE
          對于BOOKSHELF中每一個記錄和BOOKSHELF_CHECKOUT匹配則是EXISTS.NOT EXISTS則是不存在的。
          NOT EXISTS往往可以使用可利用的索引,NOT IN 可能無法使用這些索引。

          posted on 2009-06-10 14:18 freebird 閱讀(1464) 評論(0)  編輯  收藏 所屬分類: 數據庫

          主站蜘蛛池模板: 商水县| 望奎县| 荣昌县| 双城市| 三江| 双桥区| 东台市| 昭通市| 藁城市| 信阳市| 绥阳县| 沧源| 大庆市| 永嘉县| 瑞安市| 高邑县| 左贡县| 达州市| 邻水| 溧水县| 澄城县| 蕉岭县| 即墨市| 安达市| 阆中市| 商丘市| 安吉县| 九龙城区| 吴川市| 原平市| 重庆市| 叙永县| 康保县| 文化| 吴川市| 开阳县| 吉隆县| 柳林县| 汶川县| 炉霍县| 金沙县|