Oracle資料庫索引

來源:互聯網
上載者:User

標籤:procedure   lan   不能   自動完成   locate   next   png   語句   普通表   

Oracle資料庫索引

在關聯式資料庫中,索引是一種與表有關的資料庫結構,它可以使對應於表的SQL語句執行得更快。索引的作用相當於圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。 

對於資料庫來說,索引是一個必選項,但對於現在的各種大型資料庫來說,索引可以大大提高資料庫的效能,以至於它變成了資料庫不可缺少的一部分。

 

索引分類:

邏輯分類

single column or concatenated     對一列或多列建所引

unique or nonunique    唯一的和非唯一的所引,也就是對某一列或幾列的索引值(key)是否是唯一的。

Function-based    基於某些函數索引,當執行某些函數時需要對其進行計算,可以將某些函數的計算結果事先儲存並加以索引,提高效率。 

Doman    索引資料庫以外的資料,使用相對較少

 

物理分類

B-Tree :normal or reverse key   B-Tree索引也是我們傳統上常見所理解的索引,它又可以分為正常所引和倒序索引。

Bitmap  : 位元影像所引,後面會細講

 

  

B-Tree 索引                                                                                 

 

  B-Tree index 也是我們傳統上常見所理解的索引。B-tree (balance tree)即平衡樹,左右兩個分支相對平衡。

B-Tree index

Root為根節點,branch 為分支節點,leaf 到最下面一層稱為葉子節點。每個節點表示一層,當尋找某一資料時先讀根節點,再讀支節點,最後找到葉子節點。葉子節點會存放index entry (索引入口),每個索引入口對應一條記錄。

Index entry 的組成部分:

Indexentry entry  header    存放一些控制資訊。

Key column length     某一key的長度

Key column value      某一個key 的值

ROWID    指標,具體指向於某一個資料

 

建立索引:

使用者登入:SQL> conn as1/as1Connected.建立表:SQL> create table dex (id int,sex char(1),name char(10));Table created.向表中插入1000條資料SQL> begin  2  for i in 1..1000  3  loop  4  insert into dex values(i,‘M‘,‘chongshi‘);  5  end loop;  6  commit;  7  end;  8  /PL/SQL procedure successfully completed.查看錶記錄SQL> select * from dex;        ID SE NAME---------- -- --------------------
... . .....
991 M chongshi 992 M chongshi 993 M chongshi 994 M chongshi 995 M chongshi 996 M chongshi 997 M chongshi 998 M chongshi 999 M chongshi 1000 M chongshi1000 rows selected.建立索引:SQL> create index dex_idx1 on dex(id);Index created.註:對錶的第一列(id)建立索引。查看建立的表與索引SQL> select object_name,object_type from user_objects;OBJECT_NAME OBJECT_TYPE--------------------------------------------------------------------------------DEX TABLEDEX_IDX1 INDEX

  索引分離於表,作為一個單獨的個體存在,除了可以根據單個欄位建立索引,也可以根據多列建立索引。Oracle要求建立索引最多不可超過32列。

SQL> create index dex_index2 on dex(sex,name);Index created.SQL>  select object_name,object_type from user_objects;OBJECT_NAME                           OBJECT_TYPE--------------------------------------------------------------------------------DEX                                       TABLEDEX_IDX1                                 INDEXDEX_INDEX2                               INDEX

 

這裡需要理解:

  編寫一本書,只有章節頁面定好之後再設定目錄;資料庫索引也是一樣,只有先插入好資料,再建立索引。那麼我們後續對資料庫的內容進行插入、刪除,索引也需要隨之變化。但索引的修改是由oracle自動完成的。

上面這張圖能更加清晰的描述索引的結構。

跟節點記錄0至50條資料的位置,分支節點進行拆分記錄0至10.......42至50,葉子節點記錄每第資料的長度和值,並由指標指向具體的資料。

最後一層的葉子節是雙向連結,它們是被有序的連結起來,這樣才能快速鎖定一個資料範圍。

如:

SQL> select * from dex where id>23 and id<32;        ID SE NAME---------- -- --------------------        24 M  chongshi        25 M  chongshi        26 M  chongshi        27 M  chongshi        28 M  chongshi        29 M  chongshi        30 M  chongshi        31 M  chongshi8 rows selected.

  如上面尋找的列子,通過索引的方式先找到第23條資料,再找到第32條資料,這樣就能快速的鎖定一個尋找的範圍,如果每條資料都要從根節點開始尋找的話,那麼效率就會非常低下。

 

 

位元影像索引                                                                        

 

  位元影像索引主要針對大量相同值的列而建立。拿全國居民登入一第表來說,假設有四個欄位:姓名、性別、年齡、和社會安全號碼,年齡和性別兩個欄位會產生許多相同的值,性別只有男女兩種值,年齡,1到120(假設最大年齡120歲)個值。那麼不管一張表有幾億條記錄,但根據性別欄位來區分的話,只有兩種取值(男、女)。那麼位元影像索引就是根據欄位的這個特性所建立的一種索引。

Bitmap Index

  從,我們可以看出,一個葉子節點(用不同顏色標識)代表一個key , start rowid 和 end rowid規定這種類型的檢索範圍,一個葉子節點標記一個唯一的bitmap值。因為一個數實值型別對應一個節點,當時行查詢時,位元影像索引通過不同位元影像取值直接的位元運算(與或),來擷取到結果集合向量(計算出的結果)。

 

舉例講解:

假設存在資料表T,有兩個資料列A和B,取值如下,我們看到A和B列中存在相同的資料。

對兩個資料列A、B分別建立位元影像索引:idx_t_bita和idx_t_bitb。兩個索引對應的儲存邏輯結構如下:

Idx_t_bita索引結構,對應的是葉子節點:

Idx_t_bitb索引結構,對應的是葉子節點:

 

對查詢“select * from t where b=1 and (a=’L’ or a=’M’)”

分析:位元影像索引使用方面,和B*索引有很大的不同。B*索引的使用,通常是從根節點開始,經過不斷的分支節點比較到最近的符合條件葉子節點。通過葉子節點上的不斷Scan操作,“掃描”出結果集合rowid。

而位元影像索引的工作方式截然不同。通過不同位元影像取值直接的位元運算(與或),來擷取到結果集合向量(計算出的結果)。

針對執行個體SQL,可以拆分成如下的操作:

1、a=’L’ or a=’M’

a=L:向量:1010

a=M:向量:0001

or操作的結果,就是兩個向量的或操作:結果為1011。

 

2、結合b=1的向量

中間結果向量:1011

B=1:向量:1001

and操作的結果,1001。翻譯過來就是第一和第四行是查詢結果。

 

3、擷取到結果rowid

目前知道了起始rowid和終止rowid,以及第一行和第四行為操作結果。可以通過試算的方法擷取到結果集合rowid。

 

位元影像索引的特點

1.Bitmap索引的儲存空間節省 

2.Bitmap索引建立的速度快

3.Bitmap索引允許索引值為空白 

4.Bitmap索引對錶記錄的高效訪問

 

建立位元影像索引:

查看錶記錄SQL> select * from dex;...................        ID SEX NAME---------- -- --------------------       991 M  chongshi       992 M  chongshi       993 G  chongshi       994 G  chongshi       995 G  chongshi       996 M  chongshi       997 G  chongshi       998 G  chongshi       999 G  chongshi      1000 M  chongshi1000 rows selected.對於上面表來說sex(性別)只有兩種值,最適合用來建立位元影像所引建立索引:SQL> create bitmap index my_bit_idx on dex(sex);Index created.查看建立的所引SQL>  select object_name,object_type from user_objects;OBJECT_NAME                           OBJECT_TYPE--------------------------------------------------------------------------------MY_BIT_IDX                               INDEX

 

 

 

建立索引的一些規則                                                   

 

1、權衡索引個數與DML之間關係,DML也就是插入、刪除資料操作。

這裡需要權衡一個問題,建立索引的目的是為了提高查詢效率的,但建立的索引過多,會影響插入、刪除資料的速度,因為我們修改的表資料,索引也要跟著修改。這裡需要權衡我們的操作是查詢多還是修改多。

2、把索引與對應的表放在不同的資料表空間。

     當讀取一個表時表與索引是同時進行的。如果表與索引和在一個資料表空間裡就會產生資源競爭,放在兩個表這空就可並存執行。

3、最好使用一樣大小是塊。

     Oracle預設五塊,讀一次I/O,如果你定義6個塊或10個塊都需要讀取兩次I/O。最好是5的整數倍更能提高效率。

4、如果一個表很大,建立索引的時間很長,因為建立索引也會產生大量的redo資訊,所以在建立索引時可以設定不產生或少產生redo資訊。只要表資料存在,索引失敗了大不了再建,所以可以不需要產生redo資訊。

 

5、建索引的時候應該根據具體的業務SQL來建立,特別是where條件,還有where條件的順序,盡量將過濾大範圍的放在後面,因為SQL執行是從後往前的。(小李飛菜刀)

 

索引常見操作                                                            

 

改變索引

SQL> alter index employees_last _name_idx storage(next 400K maxextents 100);

索引建立後,感覺不合理,也可以對其參數進行修改。詳情查看相關文檔

 

調整索引的空間:

新增加空間SQL> alter index orders_region_id_idx allocate extent (size 200K datafile ‘/disk6/index01.dbf‘);釋放空間SQL> alter index oraers_id_idx deallocate unused;

索引在使用的過程中可能會出現空間不足或空間浪費的情況,這個時候需要新增或釋放空間。上面兩條命令完成新增與釋放操作。關於空間的新增oracle可以自動協助,如果瞭解資料庫的情況下手動增加可以提高效能。

 

重新建立索引

所引是由oracle自動完成,當我們對資料庫頻繁的操作時,索引也會跟著進行修改,當我們在資料庫中刪除一條記錄時,對應的索引中並沒有把相應的索引只是做一個刪除標記,但它依然佔據著空間。除非一個塊中所有的標記全被刪除的時,整個塊的空間才會被釋放。這樣時間久了,索引的效能就會下降。這個時候可以重建立立一個乾淨的索引來提高效率。

SQL> alter index orders_region_id_idx rebuild tablespace index02;

通過上面的命令就可以重現建立一個索引,oracle重建立索引的過程:

1、鎖表,鎖表之後其他人就不能對錶做任何操作。

2、建立新的(乾淨的)臨時索引。

3、把老的索引刪除掉

4、把新的索引重新命名為老索引的名字

5、對錶進行解鎖。

 

移動所引

其實,我們移動索引到其它資料表空間也同樣使用上面的命令,在指定資料表空間時指定不同的資料表空間。新的索引建立在別位置,把老的幹掉,就相當於移動了。

SQL> alter index orders_region_id_idx rebuild tablespace index03;

 

線上重新建立索引

上面介紹,在建立索引的時候,表是被鎖定,不能被使用。對於一個大表,重新建立索引所需要的時間較長,為了滿足使用者對錶操作的需求,就產生的這種線上重新建立索引。

SQL> alter index orders_id_idx  rebuild  online;

建立過程:

1、鎖住表

2、建立立臨時的和空的索引和IOT表用來存在on-going DML。普通表存放的索引值,IOT所引表直接存放的表中資料;on-gong DML也就是使用者所做的一些增刪改的操作。

3、對錶進行解鎖

4、從老的索引建立一個新的索引。

5、IOT表裡存放的是on-going DML資訊,IOT表的內容與新建立的索引合并。

6、鎖住表

7、再次將IOT表的內容更新到新索引中,把老的索引幹掉。

8、把新的索引重新命名為老索引的名字

9、對錶進行解鎖

 

整合索引片段

如,在很多索引中有剩餘的空間,可以通過一個命令把剩餘空間整合到一起。  

SQL> alter index orders_id_idx  coalesce;

 

刪除索引

SQL> drop  index  hr.departments_name_idx;

 

 

 

分析索引                                                                                  

  

  檢查所引的有效果,前面介紹,索引用的時間久了會產生大量的片段、垃圾資訊與浪費的剩餘空間了。可以通過重新建立索引來提高所引的效能。

可以通過一條命令來完成分析索引,分析的結果會存放在在index_stats表中。

查看存放分析資料的表:SQL> select count(*) from index_stats;  COUNT(*)----------         0執行分析索引命令:SQL> analyze index my_bit_idx validate structure;Index analyzed.再次查看 index_stats 已經有了一條資料SQL> select count(*) from index_stats;  COUNT(*)----------         1把資料查詢出來:SQL> select height,name,lf_rows,lf_blks,del_lf_rows from index_stats;    HEIGHT   NAME              LF_ROWS   LF_BLKS   DEL_LF_ROWS---------- ---------------------------------------------------------------------- ---------- -----------         2   MY_BIT_IDX            1000          3            100  

分析資料分析

(HEIGHT)這個所引高度是2 ,(NAME)索引名為MY_BIT_IDX  ,(LF_ROWS)所引表有1000行資料,(LF_BLKS)佔用3個塊,(DEL_LF_ROWS)刪除100條記錄。

  這裡也驗證了前面所說的一個問題,刪除的100條資料只是標記為刪除,因為總的資料條數依然為1000條,佔用3個塊,那麼每個塊大於333條記錄,只有刪除的資料大於333條記錄,這時一個塊被清空,總的資料條數才會減少。

Oracle資料庫索引

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.