隨筆-94  評論-56  文章-3  trackbacks-0
          索引是表的一個概念部分 , 用來提高檢索數據的效率, ORACLE 使用了一個復雜的自平衡 B-tree 結構 . 通常 , 通過索引查詢數據比全表掃描要快 . ORACLE 找出執行查詢和 Update 語句的最佳路徑時 , ORACLE 優化器將使用索引。
          大部分的性能問題其實都是索引應用的問題,Where子句、Order By、Group?By 都要用到索引。
          一般開發人員認為將索引建全了就可以下班回家了,實則還有頗多的思量和陷阱。


          索引列上不要使用IS NULL 或 IS NOT NULL
          ×?SELECT?Col?FROM?tbl?WHERE?col?IS?NULL

          索引列上不要使用函數
          ×?SELECT?Col?FROM?tbl?WHERE?substr(name , ? 1 , ? 3 )? = ?'ABC'
          ○?SELECT?Col?FROM?tbl?WHERE?name?LIKE?'ABC%'
          WHERE子句中,如果索引列是函數的一部分.優化器將不使用索引而使用全表掃描.

          索引列上不要使用NOT != 、 <>
          ×?SELECT?Col?FROM?tbl?WHERE?col?! = ? 10
          ○?SELECT?Col?FROM?tbl?WHERE?col?>?
          10 ?OR?col?<? 10

          記住 , 索引只能告訴你什么存在于表中 , 而不能告訴你什么不存在于表中 . 要避免在索引列上使用NOT, NOT會產生在和在索引列上使用函數相同的影響. ORACLE”遇到”NOT,他就會停止使用索引轉而執行全表掃描。

          索引列上不要進行計算

          ×?SELECT?Col?FROM?tbl?WHERE?col?/? 10 ?>? 10
          ○?SELECT?Col?FROM?tbl?WHERE?col?>?
          10 ?*? 10
          這是最最普遍的失效陷阱,比如where trunc(order_date)=trunc(sysdate), i+2>4。索引失效的原因也簡單,索引是針對原值建的二叉樹,你將列值*3/4+2折騰一番后,原來的二叉樹當然就用不上了。




          ?


          posted on 2007-01-22 11:13 小言身寸 閱讀(2296) 評論(0)  編輯  收藏 所屬分類: 數據庫/SQL語言
          主站蜘蛛池模板: 亳州市| 阳朔县| 仙游县| 嘉兴市| 金山区| 南宁市| 英吉沙县| 上犹县| 时尚| 磐安县| 繁峙县| 英超| 德庆县| 封丘县| 扎兰屯市| 新闻| 达拉特旗| 峨眉山市| 阜新市| 南木林县| 冷水江市| 临澧县| 阳城县| 康乐县| 岑溪市| 辛集市| 广丰县| 清远市| 兴山县| 华蓥市| 沈丘县| 章丘市| 浙江省| 乳山市| 全南县| 南陵县| 苗栗市| 贵南县| 孟津县| 响水县| 乌拉特中旗|