索引是表的一個(gè)概念部分
,
用來(lái)提高檢索數(shù)據(jù)的效率,
ORACLE
使用了一個(gè)復(fù)雜的自平衡
B-tree
結(jié)構(gòu)
.
通常
,
通過索引查詢數(shù)據(jù)比全表掃描要快
.
當(dāng)
ORACLE
找出執(zhí)行查詢和
Update
語(yǔ)句的最佳路徑時(shí)
, ORACLE
優(yōu)化器將使用索引。
大部分的性能問題其實(shí)都是索引應(yīng)用的問題,Where子句、Order By、Group?By 都要用到索引。
一般開發(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ì)原值建的二叉樹,你將列值*3/4+2折騰一番后,原來(lái)的二叉樹當(dāng)然就用不上了。
?
posted on 2007-01-22 11:13
小言身寸 閱讀(2295)
評(píng)論(0) 編輯 收藏 所屬分類:
數(shù)據(jù)庫(kù)/SQL語(yǔ)言