資料庫索引

2021-08-16 09:18:48 字數 1813 閱讀 2680

如下是可能導致索引失效的情況:

1.隱式轉換導致索引失效.這一點應當引起重視.也是開發中經常會犯的錯誤.

由於表的字段tu_mdn定義為varchar2(20),但在查詢時把該字段作為number型別以where條件傳給oracle,這樣會導致索引失效.

錯誤的例子:select * fromtest where tu_mdn=13333333333;

正確的例子:select * fromtest where tu_mdn='13333333333';

2.對索引列進行運算導致索引失效,我所指的對索引列進行運算包括(+,-,*,/,! 等)

錯誤的例子:select* from test where id-1=9;

正確的例子:select * fromtest where id=10;

3.使用oracle內部函式導致索引失效.對於這樣情況應當建立基於函式的索引.

錯誤的例子:select * from test where round(id)=10;說明,此時id的索引已經不起作用了

正確的例子:首先建立函式索引,create index test_id_fbi_idx on test(round(id));然後select * from test where round(id)=10; 這時函式索引起作用了

4.以下使用會使索引失效,應避免使用;

a. 使用 <> 、not in、not exist、!=

b. like "%_"百分號在前(可採用在建立索引時用reverse(columnname)這種方法處理)

c. 單獨引用復合索引裡非第一位置的索引列.應總是使用索引的第乙個列,如果索引是建立在多個列上,只有在它的第乙個列被 where子句引用時,優化器才會選擇使用該索引。

d.字元型字段為數字時在where條件裡不新增引號.

e.當變數採用的是times變數,而表的字段採用的是date變數時.或相反情況。

5. 不要將空的變數值直接與比較運算子(符號)比較。

如果變數可能為空,應使用 is null 或 is not null 進行比較,或者使用 isnull函式。

6. 不要在 sql **中使用雙引號。

因為字元常量使用單引號。如果沒有必要限定物件名稱,可以使用(非 ansi sql標準)括號將名稱括起來。

7.將索引所在表空間和資料所在表空間分別設於不同的磁碟chunk上,有助於提高索引查詢的效率。

8.oracle預設使用的基於代價的sql優化器(cbo)非常依賴於統計資訊,一旦統計資訊不正常,會導致資料庫查詢時不使用索引或使用錯誤的索引。

一般來說,oracle的自動任務裡面會包含更新統計資訊的語句,但如果表資料發生了比較大的變化(超過20%),可以考慮立即手動更新統計資訊,例如:analyze table abc computestatistics,但注意,更新統計資訊比較耗費系統資源,建議在系統空閒時執行。

9. oracle在進行一次查詢時,一般對乙個表只會使用乙個索引.

因此,有時候過多的索引可能導致oracle使用錯誤的索引,降低查詢效率。例如某錶有索引1(policyno)和索引2(classcode),如果查詢條件為policyno = 『xx』 and classcode = 『xx』,則系統有可能會使用索引2,相較於使用索引1,查詢效率明顯降低

10. 優先且盡可能使用分割槽索引。

資料庫 資料庫索引

索引是儲存引擎用於快速找到記錄的一種資料結構。索引以檔案的形式儲存在磁碟中。索引可以包含乙個或多個列的值。儲存引擎查詢資料的時候,先在索引中找對應值,然後根據匹配的索引記錄找到對應的資料行。1.b tree索引 2.雜湊索引 myisam和innodb儲存引擎 只支援btree索引,也就是說預設使用...

資料庫mysql索引 資料庫 mysql索引

mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...

資料庫索引

索引 索引列唯一索引 主鍵索引 聚簇索引和非聚簇索引 如何建立索引 如何刪除索引 使用索引可快速訪問資料庫表中的特定資訊。索引是對資料庫表中一列或多列的值進行排序的一種結構,例如 employee 表的姓 lname 列。如果要按姓查詢特定職員,與必須搜尋表中的所有行相比,索引會幫助您更快地獲得該資...