ORACLE索引總結

2022-04-04 02:17:18 字數 3523 閱讀 9853

分類: oracle技術

2006-10-23 23:19

3595人閱讀

收藏 舉報

oracle

statistics

null

insert

優化table一.b

樹索引0.     b樹索引中不存在非唯一的條目。

1)在非唯一索引中,oracle會把rowid作為乙個額外的列追加到鍵上,使得鍵唯一。exp:create index i on t( x , y ) ,從概念上講就是create unique index i on t(x , y , rowid)。oracle會首先按索引鍵值排序,然後再按照rowid公升序排序。

2)在唯一索引中,資料只按索引鍵值排序。

1. 大多數情況下,b樹索引的高度都是2或者3,所以一般情況下,在索引中找到乙個鍵只需要2或3次i/o。

2. b樹索引所有葉子塊都應該在同一層上,並且葉子節點實際上都是雙向鍊錶,這樣在進行索引區間掃瞄(index range scan)的時候,只需通過葉子節點的向前或者向後就可以了,無需再對索引結構進行導航。

3. 適當對b樹索引存在重複值的列進行壓縮, 可以增加快取命中率,使i/o數減少,因為

相關的條目可能都存在在乙個塊中。(exp:create index i on t(userid , username) username=』steven』這個值可能就會對應於多個rowid放在同乙個索引塊中);但是帶來的負面作用是使索引結構複雜化,維護索引更耗時,查詢索引占用cpu更多的時間。(壓縮適合用於多列索引中)

4. b樹索引的反向鍵索引主要用於緩解索引右側緩衝區忙等待。適合用於類似於sequence產生的pk主鍵上,因為這些列不太會需要使用區間掃瞄,也就是不會用到max(pk),min(pk),between and或者where pk < 200等查詢

5. 如果在查詢中會有order by colum1 asc,column2 desc, 試著在建立索引時create index i on t(colum1asc,column2 desc) , 因為oracle index預設是desc排序,在索引中排序總比在磁碟中排序好得多。

6. 適合

b樹索引使用的

2種情況:

1)訪問表中佔很小比例的行

2)根本不訪問表,所需查詢的資料全部在索引中

3)一種特殊的用法,使用索引訪問表的全部行,這樣的做法是為了使查詢最初的響應時間很短,不是針對總吞吐量進行的優化。

7. 索引是按索引鍵順序儲存,索引會按鍵的有序順序進行訪問。索引指向的塊則隨機儲存在堆中。

8. 建議:在thin表中使用b樹索引查詢<2-3%的列,fat表中<20-25%的列。

二.函式索引

1. 函式索引的好處: exp: function(column1) 如果表中有1000行,即便column1列上建有索引,索引在此時也不被使用,function會執行1000次。

2. 建立函式索引會使插入/更新效能稍有下降,但是查詢速度有了極大的提高。另外如果更新的時候沒有涉及到建立函式索引的這個列,那就不會產生額外的開銷。

3.   部分行建立索引:

1)某一列只有很少的基數,例如只有y和n

2)通常只會查詢where column1 = 『n』

3)並且值為n的行佔很小的比例

4)在此列上建立索引,由於很大的一部分索引空間是浪費的(等於y的),不會使用到的,所以我們可以在值為』n』的那些行上面建立索引。

5)create index i on t(decode(column1 , 『n』, 『n』))

6)利用的是b樹索引特性,如果列值為null,在索引中就沒有相應的條目。

4.使用函式索引來保證複雜的約束:(某個條件成立時,x,y,z必須唯一)

1)如果專案表,專案有2種狀態,active和inactive

2)希望active的專案必須有唯一的專案名,inactive的專案沒有此要求

3)此時專案狀態這列上我們不適合建立唯一鍵

4)但是我們可以建立乙個唯一索引

5)create unique index i on t(decode(status , 『active』 , name))

6)利用的還是b樹索引特性,如果列值為null,在索引中就沒有相應的條目。

三.索引的一些常見問題

1.b樹索引特性,如果列值為null,在索引中就沒有相應的條目。

1)create table t (x int , y int)

2)create unique index i t(x , y)

3)insert into t values(1 , 1)

4)insert into t values(null , 1)

5)insert into t values(1 , null)

6)insert into t values(null , null)

7)此時索引中只有三行.(null , null)不在索引行中

8)insert into t values(null , null) --成功插入

9)insert into t values(1 , null)    --報錯,違反index唯一性

10)所以我們可以看到oracle中null <> null (null代表n/a)

11)where x is null   --這個查詢無法使用索引,因為(null,null)不在索引中,如果oracle使用索引就會得到錯誤的答案

12)同樣能夠得出結論,如果在乙個允許null的列上面建立索引,x is null也不會使用索引

13)可以使用索引的條件create table t (x int , y int not null);

2.外來鍵建立索引是需要的

3.索引跳躍式掃瞄

1)create index i t(x , y)

2)select * from t where x=5; --此時優化器可能不會使用索引

3)select x , y from t where x=5;      --可能使用索引,因為所需要的內容都在索引中

4)索引跳躍式掃瞄—skip scan

5)如果y只有2個基數,y和n ,oracle會採用index

6)select * from t where x=5;   --會經過如下處理

7)select * from t where x=5 and y=』y』

8)union all

9)select * from t where x=5 and y=』n』;

4.如果索引建立在乙個允許null的列上面, select * from t就會使用全表掃瞄,不使用索引,因為null的行並不在索引行中,所以不會使用index統計數目。

5.select * from t where x=5 等價於select * from t where to_number(x)=』5』,由於存在隱式轉換,所以x上的索引不會得到使用

6.where trunc(date) = trunk(sysdate) 可以轉換成 date >=trunc(sysdate) and date

7.定期分析表

如果發現

oracle 

在有索引的情況下,沒有

Oracle索引總結

oracle索引分為普通索引 b樹索引 唯一索引 b樹索引 位圖索引和全文索引 比較少用,此文不作介紹 1 普通索引 普通索引的唯一任務是加快對資料的訪問速度。因此,應該只為那些最經常出現在查詢條件 where column 或排序條件 order by column 中 的資料列建立索引。只要有可...

oracle 索引使用及索引失效總結

容易引起oracle索引失效的原因很多 1 在索引列上使用函式。如substr,decode,instr等,對索引列進行運算.需要建立函式索引就可以解決了。2 新建的表還沒來得及生成統計資訊,分析一下就好了 3 基於cost的成本分析,訪問的表過小,使用全表掃瞄的消耗小於使用索引。4 使用 not ...

oracle 索引使用及索引失效總結

容易引起oracle索引失效的原因很多 1 在索引列上使用函式。如substr,decode,instr等,對索引列進行運算.需要建立函式索引就可以解決了。2 新建的表還沒來得及生成統計資訊,分析一下就好了 3 基於cost的成本分析,訪問的表過小,使用全表掃瞄的消耗小於使用索引。4 使用 not ...