oracle index學(xué)習總結(jié)
oracleindex
1.index需要儲存空間和I/O操作。2.index的目的是加快select的速度的。
3.insert,update,delete數(shù)據(jù)oracle會同時對索引進行相應(yīng)的調(diào)整,因此會增加一定的消耗。4.使用index一定能加快select速度嗎?不是的,數(shù)據(jù)少和巨大時index會影響select的速度,因此如果查詢速度可以滿足,就不要建index。5.Index對null無效。
分類:
一、從物理角度
1.partitionedornonpartitioned:分區(qū)或不分區(qū)索引。分區(qū)索引用于分區(qū)表。
2.B-tree(平衡樹):normalorreversekey正常和倒序索引。
oracle默認索引方式,平衡樹形索引,在葉子節(jié)點上有雙向鏈表,加快索引定位速度,oracle有一定的優(yōu)化,可以根據(jù)鏈表直接定位記錄,而不走樹,綜合使用提高速度。見圖1和圖2。
圖1
圖
3.bitmap(位圖):用二進制的0、1來構(gòu)建索引,在進行or操作時非?,但要注意bitmap對于并發(fā)操作時,改一條會鎖了很多記錄,因為所有的記錄在一個索引條目上,所以修改或增加時會一起鎖定,見圖3.
圖
區(qū)別和使用場景B-tree索引Bitmap索引Suitableforhigh-cardinalitySuitableforlow-cardinalitycolumns(用在記錄相同的columns(記錄對應(yīng)的列重復(fù)值較多的列上,如果性別只有兩種值:男和女)。的值較少,如主鍵,姓名等)。UpdatesonkeysrelativelyUpdatestokeycolumnsveryexpensiveinexpensive(在做updated(在做updated時,bitmap的消耗是昂貴的)。時,b-tree只消耗很少的資源)。InefficientforqueriesusingEffcientforqueriesusingORpredicatesORpredicates(where子句中(where子句中or條件較多時速度非?欤﹐r條件較多時速度較慢)UsefulforOLTP(記錄頻繁的Usefulfordatawarehousing(OLIP)數(shù)據(jù)倉庫,查insert和update,查詢相對較少詢系統(tǒng)等較少做數(shù)據(jù)修改的系統(tǒng)。的系統(tǒng))。
二、邏輯角度:
1.singlecolumnorconcatenated單索引和組合索引。2.uniqueornonunique:唯一索引和非唯一索引。
3.function-based:基于函數(shù)的索引,把一些where條件作為函數(shù)。4.domain:數(shù)據(jù)庫以外的索引,如文件等。三、創(chuàng)建index時的注意事項:
1.balancequeryandDMLneeds:索引的目的是為了提高查詢速度,但它會加重DML的負擔。2.placeinseparatetablespace:索引和表應(yīng)該放在不同的表空間,如果把索引和表放在同一個空間,會引起競爭,因為在讀取一個表時,記錄和索引是同時讀取,修改也同步進行的。3.useuniformextentsizes:Multipesoffiveblocksorminimumextentsizefortablespace.索引空間是extent是大小應(yīng)該是5blocks的倍數(shù),因為oracle是一次讀出5個blocks,如果你的extends是6,就會造成2次I/O操作。
4.considernologgingforlargeindexes:在創(chuàng)建索引時可以關(guān)閉索引對應(yīng)的redo日志,提高速度,因為索引和數(shù)據(jù)不同,如果索引創(chuàng)建時出意外,數(shù)據(jù)還在,就再創(chuàng)建一次好了。5.INITRANSshouldgenerallybehigheronindexesthanonthecorrespondingtables:INITRANS參數(shù)比對應(yīng)的表的值大些,因為索引也是已表記錄的方式保存的,但索引大大小于表的記錄,所以一個block中存儲的索引記錄就大大多于表在一個block中的記錄,加大INITRANS可以增加在一個block中的事務(wù)的并發(fā)數(shù),就提高了效率。
6.rebuildingindexes:如果刪除一條記錄,對應(yīng)的索引僅僅是做了邏輯刪除,只有一個block中的全部索引都被標識為邏輯刪除,orcle才會真正的回收block,這時這個block才能被再次利用,在表的記錄做update時,index是先做了邏輯刪除,然后再為該記錄新建一個索引的,所以表在頻繁的增刪改后,就會造成index對應(yīng)的block不完整,和系統(tǒng)碎片的情況是一致的,造成空間浪費,加大index的I/O,影響性能。而rebuildingindexes就可以回收原來的,重新構(gòu)建一個高效的索引,但重構(gòu)時會鎖表。語法:alterindexindex_namerebuild;
7.coalescingindexes:整理索引碎片,效率高,不鎖表。
語法:Alterindexindex_namecoalesce;
四.管理索引
1.分析索引:
1)select*fromuser_objectswhereobject_type="INDEX"2)analyzeindexPK_T_TICKETvalidatestructure;
3)select*fromindex_stats;
HEIGHT(b-treeBLOCKS(索引NAME(索引LF_ROWS(記DEL_LF_ROWS的高度)有多少塊)名)錄數(shù))(刪除記錄數(shù))2256PK_T_TICKET82775792當DEL_LF_ROWS/LF_ROWS>15%時應(yīng)進行索引重建或索引碎片整理。
2.drop索引:當屁量導(dǎo)入大量數(shù)據(jù)時,索引會影響導(dǎo)入速度?梢袁F(xiàn)在drop掉,導(dǎo)入后再重建索引。
3.監(jiān)控索引:
1)設(shè)置監(jiān)控那個索引alterindexpk_t_ticketmonitoringusage;
2)查看該索引用沒有使用select*fromv$object_usage3)selectcount(1)frompk_t_ticket;
4)查看該索引用沒有使用select*fromv$object_usage5)關(guān)閉監(jiān)控alterindexpk_t_ticketnomonitoringusage;監(jiān)控一個月就大概可以知道那些是無用的索引了。6)查詢索引的詳細信息:select*fromall_ind_columnswhereindex_name="PK_T_TICKET".那個表的那個列上有索引及詳細信息。
擴展閱讀:
友情提示:本文中關(guān)于《oracle index學(xué)習總結(jié)》給出的范例僅供您參考拓展思維使用,oracle index學(xué)習總結(jié):該篇文章建議您自主創(chuàng)作。
來源:網(wǎng)絡(luò)整理 免責聲明:本文僅限學(xué)習分享,如產(chǎn)生版權(quán)問題,請聯(lián)系我們及時刪除。