分類: 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 ...