計算機學習積累

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

          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)  編輯  收藏 所屬分類: 數據庫

          主站蜘蛛池模板: 凤庆县| 霞浦县| 长岭县| 永福县| 老河口市| 溆浦县| 东宁县| 沁阳市| 卢龙县| 南昌市| 公安县| 松滋市| 永州市| 峨眉山市| 嵩明县| 汝阳县| 巢湖市| 柳林县| 格尔木市| 阜康市| 桂林市| 登封市| 积石山| 贵定县| 康平县| 尼木县| 明溪县| 甘洛县| 杭州市| 泌阳县| 玉树县| 遵化市| 龙南县| 长寿区| 洛隆县| 德钦县| 托克逊县| 博客| 兴安盟| 元朗区| 平罗县|