程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 深入探討Oracle函數索引

深入探討Oracle函數索引

編輯:Oracle數據庫基礎

Oracle還是比較常用的,於是我研究了一下Oracle函數索引,在這裡拿出來和大家分享一下,希望對大家有用。

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

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

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.使用Oracle函數索引來保證復雜的約束:(某個條件成立時,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,在索引中就沒有相應的條目。

Oracle函數索引索引的一些常見問題

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<trunk(sysdate+1)

7.定期分析表:如果發現Oracle 在有索引的情況下,沒有使用索引,這並不是Oracle 的優化器出錯。在有些情況下,Oracle 確實會選擇全表掃描(Full Table Scan),而非索引掃描(Index Scan)。

8.有些情況下單列索引不如復合索引有效率!以上介紹Oracle函數索引。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved