索引是一種允許直接訪問數(shù)據(jù)表中某一數(shù)據(jù)行的樹型結(jié)構(gòu),為了提高查詢效率而引入,是一個(gè)獨(dú)立于表的對象,可以存放在與表不同的表空間中。索引記錄中存有索引關(guān)鍵字和指向表中數(shù)據(jù)的指針(地址)。對索引進(jìn)行的I/O操作比對表進(jìn)行操作要少很多。索引一旦被建立就將被Oracle系統(tǒng)自動(dòng)維護(hù),查詢語句中不用指定使用哪個(gè)索引。 分類可以按邏輯設(shè)計(jì)和物理實(shí)現(xiàn)來分類。 索引邏輯分類 單列索引:基于一列的操作 多列索引:組合索引,最多為32列。組合索引的列不一定與表中列順序相同。 惟一索引:列的值各不相同。 非惟一索引:列的值允許相同。 基于函數(shù)的惟一索引:利用表中一列或多列基于函數(shù)表達(dá)式所創(chuàng)建的索引。既可以是B-樹,也可以是位圖索引。 索引物理分類 分區(qū)或非分區(qū)索引,非分區(qū)既可以是B-樹,也可以是位圖索引。 B-樹:包括正?;蚍崔D(zhuǎn)關(guān)鍵字索引,反轉(zhuǎn)關(guān)鍵字在數(shù)據(jù)庫優(yōu)化中介紹。 位圖索引 B-樹索引 索引的存儲(chǔ)方式 雖然所有索引都使用 B 樹結(jié)構(gòu),但術(shù)語“B 樹索引”通常與存儲(chǔ)每個(gè)關(guān)鍵字的行標(biāo)識列表的索引關(guān)聯(lián)。 B 樹索引結(jié)構(gòu) 至上而下,是根結(jié)點(diǎn)、分枝結(jié)點(diǎn)及葉子結(jié)點(diǎn),葉子結(jié)點(diǎn)中有指向表中數(shù)據(jù)行的索引行。葉子結(jié)點(diǎn)被雙向鏈表在一起,以方便按索引關(guān)鍵字升序或降序掃描。 索引的頂部為根,其中包含指向索引中下一級的項(xiàng),下一級為分枝塊,分枝塊又指向索引中下一級的塊,最低一級為葉節(jié)點(diǎn),其中包含指向表行的索引項(xiàng)。葉塊為雙重鏈接,有助于按關(guān)鍵字值的升序和降序掃描索引。 索引項(xiàng)葉節(jié)點(diǎn)的格式 索引項(xiàng)由以下三部分組成: 項(xiàng)標(biāo)題(entry header),存儲(chǔ)列數(shù)和鎖定信息 關(guān)鍵字列的“長度- 值”(length-value pairs) ,必需成對出現(xiàn),定義了列長度,緊跟在列長度之后的就是列的值。 行的行標(biāo)識(RowID), 包含關(guān)鍵字值。 索引項(xiàng)葉結(jié)點(diǎn)的特征 在非分區(qū)表上的 B 樹索引中: 如果多行具有相同的關(guān)鍵字值,并且索引沒有被壓縮,則關(guān)鍵字值重復(fù)存放。 沒有索引項(xiàng)與所有關(guān)鍵字列都為 NULL 的行對應(yīng),即如果某列值為Null,則不存儲(chǔ)相應(yīng)的索引項(xiàng)。如果Where子句中索引的所在列值為null,Oracle將不使用索引進(jìn)行全表掃描。 因?yàn)樗行卸紝儆谕欢?,所以使用受限行?biāo)識指向表中的行,使用RowID可以節(jié)省索引存儲(chǔ)空間。 DML 操作對索引的影響 當(dāng)在表上執(zhí)行 DML 操作時(shí),Oracle 服務(wù)器將自動(dòng)維護(hù)所有的索引,下面解釋 DML命令對索引的影響: 插入(Insert)操作導(dǎo)致在適當(dāng)?shù)膲K中插入索引項(xiàng)。 刪除(Delete)行只導(dǎo)致邏輯刪除索引項(xiàng),刪除的行所用的空間不能用于新項(xiàng),直到刪除塊中的所有項(xiàng)。 更新(Update)操作將選刪除,再插入,除了在創(chuàng)建時(shí),其它任何時(shí)候PCTFREE 設(shè)置對索引都沒有影響,即使索引塊空間少于 PCTFREE 指定的空間,仍可以向索引塊添加新項(xiàng)。 |
|