Oracle索引原理

索引原理

  1. oracel中索引類型很多,默認採用B樹索引。
  2. oracle中的索引與mysql中的索引不一樣,oracle中索引是存儲了索引列的值以及rowid值。而mysql索引分爲聚集索引,非聚集索引。其中聚集索引只能有一個。
  3. oracle中索引的主要分爲根,莖,葉子三部分。索引列值都是存放在葉子節點上,莖只是存放了葉子節點的相關信息。
  4. oracle中的索引反應的是邏輯結構,不是物理結構。索引創建的時候,是先創建葉子節點,然後再創建莖,最後創建根。從索引的創建過程分析可以看出來。
  5. oracle中數據單位是以塊爲單位的,數據存儲滿一個數據塊block,再去存儲下一個數據塊block。

索引特點

  1. 索引高度一般比較低
  2. 索引是按照有序排列的。
  3. 索引存儲列值及rowid值

如何建索引

  1. oracle會在主鍵上創建索引
  2. oracle會在非空唯一索引列上創建索引。
  3. 經常出現的謂詞,即出現在執行頻率很高的SQL查詢的where條件中的列上。
  4. 索引最好有單獨的表空間,有利於備份和維護

索引缺點

  1. 索引需要佔據存儲空間,索引能提供查詢速度,但是維護和更新卻浪費空間。因爲索引是有序排列的。

影響性能緣由

  1. oracle中sql語句,在查詢時影響性能主要有邏輯讀,排序,花費時間time代價cost(cpu)全表掃描等多個因素。

索引應用

  1. order by
    1.1 order by 列名。會對order by 後面的列進行排序,
  2. distinct
    2.1 distinct 會進行排序

索引壓縮

  1. 在索引列中(一列或者多列),如果有多行數值相同,爲了提供查詢數據速度,可以將索引進行壓縮存儲。索引最終也是要存儲在數據塊上,壓縮索引是爲了減少掃描數據塊的個數。
  2. 可以採用compress N子句方式創建壓縮索引。
  3. create index index_name on tableName(col1,col2) compress N。
    3.1 如果N爲1,則會對第一列進行壓縮存儲,N爲2,則會對第一列和第二列壓縮存儲。

組合索引設計

  1. 適當場合儘量避免回表讀
  2. 組合索引中的列數越少越高效
  3. 組合索引中有2列時,情況又不一樣:
    3.1 組合索引中,等值查詢時,無論哪列在前在後都無所謂。
    3.2 組合索引的2列中,如果一列是範圍查詢,一列是等值查詢,則一定要把等值查詢放在前面,範圍查詢列放在後面才能使索引高效。這裏是創建索引的時候,等值查詢列在組合索引的最前面,範圍列在最後面,不是sql語句中的書寫順序。
  4. 如果單列的查詢與組合索引的前置列查詢一樣,則單列可以不用創建索引,直接利用組合索引來檢索數據。最好將該列放在組合索引的第一列
  5. 經常一起出現在where字句中的列可以創建索引

函數索引

  1. 在SQL查詢中,如果where條件中的列上創建了索引,但是在該索引列上使用了函數,則oracle函數會使當前列上的索引失效。
  2. 對於上述情況,需要創建函數索引。
  3. 創建函數索引需要在創建語句中指定使用的函數和列。create index index_name on table_name(函數(列名))
  4. 如果創建了函數索引,則不能直接修改。需要先刪除索引,再修改列,然後重建。

不可見索引

  1. 有時候想增加一個索引而又不影響線上應用的性能,即通知SQL優化器默認不使用該索引。需要在創建索引的時候,設置爲不可見。
  2. create index index_Name on table_name(col1,col2) invisible。
  3. 創建完索引後,需要確保optimizer_use_invisible_indexes的值爲true。可以使用alter system set optimizer_use_invisible_indexes= true
  4. 使用hit提示,可以顯示通知優化器使用該索引。

查看錶中索引方式

  1. 可以在表user_indexes中查看索引方式 。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章