作者 | 末
來源 | https: //www.cnblogs.com/areyouready/p/7802885.html
- 隱式轉(zhuǎn)換導(dǎo)致索引失效.這一點應(yīng)當(dāng)引起重視.也是開發(fā)中經(jīng)常會犯的錯誤.
由于表的字段tu_mdn定義為varchar2(20),但在查詢時把該字段作為number類型以where條件傳給Oracle,這樣會導(dǎo)致索引失效.
錯誤的例子:select from test where tu_mdn=13333333333;
正確的例子:select from test where tu_mdn='13333333333';
- 對索引列進行運算導(dǎo)致索引失效,我所指的對索引列進行運算包括(+疾就,-,,/评疗,! 等)
錯誤的例子:select from test where id-1=9;
正確的例子:select from test where id=10;
- 使用Oracle內(nèi)部函數(shù)導(dǎo)致索引失效.對于這樣情況應(yīng)當(dāng)創(chuàng)建基于函數(shù)的索引.
錯誤的例子:select from test where round(id)=10; 說明洽胶,此時id的索引已經(jīng)不起作用了
正確的例子:首先建立函數(shù)索引西采,create index test_id_fbiidx on test(round(id));然后 select * from test where round(id)=10; 這時函數(shù)索引起作用了
- 以下使用會使索引失效壹店,應(yīng)避免使用诺舔;
a. 使用 <> 奉狈、not in 卤唉、not exist、!=
b. like "%" 百分號在前(可采用在建立索引時用reverse(columnName)這種方法處理)
c. 單獨引用復(fù)合索引里非第一位置的索引列.應(yīng)總是使用索引的第一個列仁期,如果索引是建立在多個列上, 只有在它的第一個列被where子句引用時桑驱,優(yōu)化器才會選擇使用該索引。
d. 字符型字段為數(shù)字時在where條件里不添加引號.
e. 當(dāng)變量采用的是times變量跛蛋,而表的字段采用的是date變量時.或相反情況熬的。
- 不要將空的變量值直接與比較運算符(符號)比較。
如果變量可能為空赊级,應(yīng)使用 IS NULL 或 IS NOT NULL 進行比較押框,或者使用 ISNULL 函數(shù)。
- 不要在 SQL 代碼中使用雙引號此衅。
因為字符常量使用單引號强戴。如果沒有必要限定對象名稱,可以使用(非 ANSI SQL 標(biāo)準(zhǔn))括號將名稱括起來挡鞍。
將索引所在表空間和數(shù)據(jù)所在表空間分別設(shè)于不同的磁盤chunk上骑歹,有助于提高索引查詢的效率。
Oracle默認(rèn)使用的基于代價的SQL優(yōu)化器(CBO)非常依賴于統(tǒng)計信息墨微,一旦統(tǒng)計信息不正常道媚,會導(dǎo)致數(shù)據(jù)庫查詢時不使用索引或使用錯誤的索引。
一般來說,Oracle的自動任務(wù)里面會包含更新統(tǒng)計信息的語句最域,但如果表數(shù)據(jù)發(fā)生了比較大的變化(超過20%),可以考慮立即手動更新統(tǒng)計信息谴分,例如:analyze table abc compute statistics,但注意镀脂,更新 統(tǒng)計信息比較耗費系統(tǒng)資源牺蹄,建議在系統(tǒng)空閑時執(zhí)行。
- Oracle在進行一次查詢時薄翅,一般對一個表只會使用一個索引.
因此沙兰,有時候過多的索引可能導(dǎo)致Oracle使用錯誤的索引,降低查詢效率翘魄。例如某表有索引1(Policyno)和索引2(classcode)鼎天,如果查詢條件為policyno = ‘xx’ and classcode = ‘xx’,則系統(tǒng)有可能會使用索 引2暑竟,相較于使用索引1斋射,查詢效率明顯降低。
- 優(yōu)先且盡可能使用分區(qū)索引但荤。
如果文章對您有幫助罗岖,請記得點贊關(guān)注喲~
歡迎大家關(guān)注我的公眾號<情系IT>,每日推送技術(shù)文章供大家學(xué)習(xí)參考纱兑。