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