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


          索引列上不要使用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會(huì)產(chǎn)生在和在索引列上使用函數(shù)相同的影響. 當(dāng)ORACLE”遇到”NOT,他就會(huì)停止使用索引轉(zhuǎn)而執(zhí)行全表掃描。

          索引列上不要進(jìn)行計(jì)算

          ×?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。索引失效的原因也簡(jiǎn)單,索引是針對(duì)原值建的二叉樹(shù),你將列值*3/4+2折騰一番后,原來(lái)的二叉樹(shù)當(dāng)然就用不上了。




          ?


          posted on 2007-01-22 11:13 小言身寸 閱讀(2296) 評(píng)論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫(kù)/SQL語(yǔ)言
          主站蜘蛛池模板: 湖口县| 湄潭县| 乐都县| 拜泉县| 万山特区| 如东县| 稻城县| 庐江县| 皮山县| 唐河县| 胶州市| 察隅县| 元朗区| 瑞昌市| 乐昌市| 小金县| 广河县| 北辰区| 手游| 原平市| 灌南县| 高碑店市| 镇江市| 芜湖县| 定边县| 延长县| 高陵县| 图片| 奉新县| 焦作市| 甘泉县| 南漳县| 临江市| 澄江县| 定结县| 延津县| 昆明市| 尉犁县| 高阳县| 大田县| 台中县|