INDEX 總結

1.index需要儲存空間和I/O操作。

2.index的目的是加快select的速度的。

3.insert,update,delete數據oracle會同時對索引進行相應的調整,因此會增加一定的消耗。

4.使用index一定能加快select速度嗎?不是的,數據少和巨大時index會影響select的速度,因此如果查詢速度可以滿足,就不要建index

5Index null 無效。

 

分類:

一、從物理角度

1. partitioned or nonpartitioned : 分區或不分區索引。分區索引用於分區表。

2.B-tree(平衡樹) : normal or reverse key 正常和倒序索引。

   oracle默認索引方式,平衡樹形索引,在葉子節點上有雙向鏈表,加快索引定位速度,oracle有一定的優化,可以根據鏈表直接定位記錄,而不走樹,綜合使用提高速度。見圖1和圖2

1



 

 

2



 

 

 

 

 

 

 

 

 

 

 

 

 

3.bitmap(位圖)  :用二進制的01來構建索引,在進行or操作時非常快, 但要注意bitmap對於併發操作時,改一條會鎖了很多記錄,因爲所有的記錄在一個索引條目上,所以修改或增加時會一起鎖定,見圖3.

3



 

 

區別和使用場景

B-tree索引

Bitmap 索引

Suitable for high-cardinality columns(記錄對應的列重複的值較少,如主鍵,姓名等 )。

Suitable for low-cardinality columns(用在記錄相同的值較多的列上,如果性別只有兩種值:男和女)

Updates on keys relatively inexpensive (在做updated時,b-tree只消耗很少的資源)。

Updates to key columns very expensive

(在做updated時,bitmap的消耗是昂貴的)。

Inefficient for queries using OR predicateswhere子句中 or條件較多時速度較慢)

Effcient for queries using OR predicates

where子句中 or條件較多時速度非常快)

Useful for OLTP(記錄頻繁的insertupdate,查詢相對較少的系統)。

Useful for data warehousing OLIP)數據倉庫,查詢系統等較少做數據修改的系統。

 

 

二、邏輯角度:

1.single column or concatenated單索引和組合索引。

2.unique or nonunique: 唯一索引和非唯一索引。

3.function-based: 基於函數的索引,把一些where條件作爲函數。

4.domain 數據庫以外的索引,如文件等。

 

 

三、創建index時的注意事項:

1.balance query and DML needs: 索引的目的是爲了提高查詢速度,但它會加重DML的負擔。

2.place in separate tablespace: 索引和表應該放在不同的表空間,如果把索引和表放在同一個空間,會引起競爭,因爲在讀取一個表時,記錄和索引是同時讀取,修改也同步進行的。

3.use uniform extent sizes:Multipes of five blocks or minimum extent size for tablespace. 索引空間是extent是大小應該是5 blocks的倍數,因爲oracle是一次讀出5blocks,如果你的extends6,就會造成2I/O操作。

4. consider nologging for large indexes 在創建索引時可以關閉索引對應的redo 日誌,提高速度,因爲索引和數據不同,如果索引創建時出意外,數據還在,就再創建一次好了。

5.INITRANS should generally be higher on indexes than on the corresponding tablesINITRANS 參數比對應的表的值大些,因爲索引也是已表記錄的方式保存的,但索引大大小於表的記錄,所以一個block中存儲的索引記錄就大大多於表在一個block中的記錄,加大INITRANS可以增加在一個block中的事務的併發數,就提高了效率。

6.rebuilding indexes:如果刪除一條記錄,對應的索引僅僅是做了邏輯刪除,只有一個block中的全部索引都被標識爲邏輯刪除,orcle纔會真正的回收block, 這時這個block才能被再次利用,在表的記錄做update時,index是先做了邏輯刪除,然後再爲該記錄新建一個索引的,所以表在頻繁的增刪改後,就會造成index對應的block不完整,和系統碎片的情況是一致的,造成空間浪費,加大indexI/O,影響性能。而rebuilding indexes就可以回收原來的,重新構建一個高效的索引,但重構時會鎖表。

              語法: alter index index_name rebuild;

7 coalescing indexes: 整理索引碎片,效率高,不鎖表。

語法:Alter index  index_name coalesce;

 

四.管理索引

1.分析索引:

1) select * from user_objects where object_type='INDEX'

2analyze index PK_T_TICKET validate structure;

3select * from index_stats;

HEIGHTb-tree的高度)

BLOCKS(索引有多少塊)

NAME(索引名)

LF_ROWS(記錄數)

DEL_LF_ROWS(刪除記錄數)

2

256

PK_T_TICKET

82775

792

DEL_LF_ROWS/ LF_ROWS>15%時應進行 索引重建或 索引碎片整理。

 

2.drop 索引:當屁量導入大量數據時,索引會影響導入速度。可以現在drop掉,導入後再重建索引。

 

3.監控索引:

    1)設置監控那個索引 alter index pk_t_ticket monitoring usage;

2)查看該索引用沒有使用select * from v$object_usage

3select count(1) from pk_t_ticket;

4) 查看該索引用沒有使用select * from v$object_usage

5)關閉監控 alter index pk_t_ticket nomonitoring usage;

監控一個月就大概可以知道那些是無用的索引了。

6) 查詢索引的詳細信息 : select * from all_ind_columns where index_name='PK_T_TICKET' .那個表的那個列上有索引及詳細信息。

copy from : http://dolphin-ygj.javaeye.com/blog/543906

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章