今天遇到了數(shù)據(jù)庫查詢語句的優(yōu)化,遇到了索引失效的激烈討論放椰。
所以今天總結(jié)一下索引失效的一些情況
1.隱式轉(zhuǎn)換導(dǎo)致索引失效。
????在日常開發(fā)中經(jīng)常發(fā)生,以后要引以為戒
????表的字段tu_mdn定義為varchar2(200),但在查詢時(shí)把該字段作為number類型以where條件傳給Oracle,這樣會(huì)導(dǎo)致索引失效.
?錯(cuò)誤的例子:select * from?stu where sn=13333333333;
因?yàn)榇嬖陔[式的類型轉(zhuǎn)換搂根,所以索引失效
?正確的例子:select * from stu?where sn='13333333333';
2. 對(duì)索引列進(jìn)行運(yùn)算導(dǎo)致索引失效。
? 對(duì)索引列進(jìn)行運(yùn)算包括(+铃辖,-剩愧,*,/娇斩,! 等)
??錯(cuò)誤的例子:select * from?stu where id-1=9;
? 正確的例子:select * from stu where id=10;
3. 使用Oracle內(nèi)部函數(shù)導(dǎo)致索引失效仁卷。
???????錯(cuò)誤的例子:select * from?stu where round(id)=10; 說明,此時(shí)id的索引已經(jīng)不起作用了
? ? ? ?對(duì)于這樣情況應(yīng)當(dāng)創(chuàng)建基于函數(shù)的索引.犬第,create index test_id_fbi_idx on test(round(id));
? ? ? 然后 select * from test where??round(id)=10; 這時(shí)函數(shù)索引起作用了
4. 以下使用會(huì)使索引失效锦积,應(yīng)避免使用;
?a. 使用 <> 歉嗓、not in 丰介、not exist、!=
?b. like "%_" 百分號(hào)在前(可采用在建立索引時(shí)用reverse(columnName)這種方法處理)
?c. 單獨(dú)引用復(fù)合索引里非第一位置的索引列.應(yīng)總是使用索引的第一個(gè)列,如果索引是建立在多個(gè)列上, 只有在它的第一個(gè)?列被where子句引用時(shí)哮幢,優(yōu)化器才會(huì)選擇使用該索引带膀。
?d. 當(dāng)變量采用的是times變量,而表的字段采用的是date變量時(shí).或相反情況橙垢。
5. 不要將空的變量值直接與比較運(yùn)算符(符號(hào))比較垛叨。
???如果變量可能為空,應(yīng)使用 IS NULL 或 IS NOT NULL 進(jìn)行比較钢悲,或者使用 ISNULL 函數(shù)点额。
6. 不要在 SQL 代碼中使用雙引號(hào)。
??因?yàn)樽址A渴褂脝我?hào)莺琳。如果沒有必要限定對(duì)象名稱还棱,可以使用(非 ANSI SQL 標(biāo)準(zhǔn))括號(hào)將名稱括起來。
7. 將索引所在表空間和數(shù)據(jù)所在表空間分別設(shè)于不同的磁盤chunk上惭等,有助于提高索引查詢的效率珍手。