計算機(jī)學(xué)習(xí)積累

          ----轉(zhuǎn)載有理,轉(zhuǎn)載是想研究,想研究才會看,看了才會有感想,轉(zhuǎn)載后我有時會寫一些自己的感受
          數(shù)據(jù)加載中……

          ORACLE中NOT IN 的替代

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

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

          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 ;
          優(yōu)化后的程序可以使用連接列上的索引。
          WHERE B.TITLE IS NULL
          表示不出現(xiàn)在BOOKSHELF_CHECKOUT中的TITLE列 (ORACLE作為NULL列返回,可參考外部連接方面的內(nèi)容)
          二:
          使用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)  編輯  收藏 所屬分類: 數(shù)據(jù)庫

          主站蜘蛛池模板: 八宿县| 田阳县| 息烽县| 阳山县| 北宁市| 鄂尔多斯市| 克什克腾旗| 竹溪县| 五莲县| 无棣县| 乌拉特前旗| 苏州市| 微博| 中江县| 高青县| 巴林左旗| 浪卡子县| 仁怀市| 泽州县| 宜黄县| 甘泉县| 厦门市| 凤庆县| 康平县| 会同县| 四川省| 金秀| 扎兰屯市| 宝丰县| 崇仁县| 青岛市| 黄山市| 贵港市| 义马市| 西昌市| 吉水县| 岱山县| 河间市| 合水县| 莆田市| 梓潼县|