計算機學習積累

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

          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 閱讀(1460) 評論(0)  編輯  收藏 所屬分類: 數據庫

          主站蜘蛛池模板: 平乐县| 台南市| 友谊县| 台东县| 黔南| 启东市| 邵阳市| 松潘县| 温泉县| 香港 | 乾安县| 海宁市| 通许县| 阳城县| 孟州市| 通州市| 铜川市| 泰州市| 西安市| 东台市| 郸城县| 金昌市| 阿拉善右旗| 辽源市| 开平市| 深水埗区| 安泽县| 桂平市| 文昌市| 陇南市| 佛教| 客服| 汾阳市| 读书| 武川县| 阿拉善左旗| 松滋市| 胶州市| 秭归县| 淮北市| 东丰县|