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


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

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

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

          記住 , 索引只能告訴你什么存在于表中 , 而不能告訴你什么不存在于表中 . 要避免在索引列上使用NOT, NOT會產(chǎn)生在和在索引列上使用函數(shù)相同的影響. 當(dāng)ORACLE”遇到”NOT,他就會停止使用索引轉(zhuǎn)而執(zhí)行全表掃描。

          索引列上不要進行計算

          ×?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折騰一番后,原來的二叉樹當(dāng)然就用不上了。




          ?


          posted on 2007-01-22 11:13 小言身寸 閱讀(2304) 評論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫/SQL語言
          主站蜘蛛池模板: 金门县| 江北区| 安国市| 乡宁县| 湖口县| 拜城县| 惠安县| 呼伦贝尔市| 新沂市| 天水市| 苏州市| 盐城市| 渝中区| 安龙县| 灵台县| 牙克石市| 上蔡县| 阳春市| 大厂| 勃利县| 长垣县| 漳州市| 辽阳县| 巨野县| 濉溪县| 姜堰市| 鹤庆县| 巴中市| 平乐县| 车致| 叶城县| 如皋市| 囊谦县| 即墨市| 建湖县| 通城县| 乃东县| 无极县| 涟水县| 伊春市| 建瓯市|