本文只討論Oracle中最常見的索引,即是B-tree索引。本文中涉及的數(shù)據(jù)庫(kù)版本是Oracle8i。
一. 查看系統(tǒng)表中的用戶索引
在Oracle中,SYSTEM表是安裝數(shù)據(jù)庫(kù)時(shí)自動(dòng)建立的,它包含數(shù)據(jù)庫(kù)的全部數(shù)據(jù)字典,存儲(chǔ)過(guò)程、包、函數(shù)和觸發(fā)器的定義以及系統(tǒng)回滾段。
一般來(lái)說(shuō),應(yīng)該盡量避免在SYSTEM表中存儲(chǔ)非SYSTEM用戶的對(duì)象。因?yàn)檫@樣會(huì)帶來(lái)數(shù)據(jù)庫(kù)維護(hù)和管理的很多問(wèn)題。一旦SYSTEM表?yè)p壞了,只能重新生成數(shù)據(jù)庫(kù)。我們可以用下面的語(yǔ)句來(lái)檢查在SYSTEM表內(nèi)有沒(méi)有其他用戶的索引存在。
二. 索引的存儲(chǔ)情況檢查
Oracle為數(shù)據(jù)庫(kù)中的所有數(shù)據(jù)分配邏輯結(jié)構(gòu)空間。數(shù)據(jù)庫(kù)空間的單位是數(shù)據(jù)塊(block)、范圍(extent)和段(segment)。
Oracle數(shù)據(jù)塊(block)是Oracle使用和分配的最小存儲(chǔ)單位。它是由數(shù)據(jù)庫(kù)建立時(shí)設(shè)置的DB_BLOCK_SIZE決定的。一旦數(shù)據(jù)庫(kù)生成了,數(shù)據(jù)塊的大小不能改變。要想改變只能重新建立數(shù)據(jù)庫(kù)。(在Oracle9i中有一些不同,不過(guò)這不在本文討論的范圍內(nèi)。)
Extent是由一組連續(xù)的block組成的。一個(gè)或多個(gè)extent組成一個(gè)segment。當(dāng)一個(gè)segment中的所有空間被用完時(shí),Oracle為它分配一個(gè)新的extent。
Segment是由一個(gè)或多個(gè)extent組成的。它包含某表空間中特定邏輯存儲(chǔ)結(jié)構(gòu)的所有數(shù)據(jù)。一個(gè)段中的extent可以是不連續(xù)的,甚至可以在不同的數(shù)據(jù)文件中。
一個(gè)object只能對(duì)應(yīng)于一個(gè)邏輯存儲(chǔ)的segment,我們通過(guò)查看該segment中的extent,可以看出相應(yīng)object的存儲(chǔ)情況。
?。?)查看索引段中extent的數(shù)量:
(2)查看表空間內(nèi)的索引的擴(kuò)展情況:
三. 索引的選擇性
索引的選擇性是指索引列中不同值的數(shù)目與表中記錄數(shù)的比。如果一個(gè)表中有2000條記錄,表索引列有1980個(gè)不同的值,那么這個(gè)索引的選擇性就是1980/2000=0.99。
一個(gè)索引的選擇性越接近于1,這個(gè)索引的效率就越高。
如果是使用基于cost的最優(yōu)化,優(yōu)化器不應(yīng)該使用選擇性不好的索引。如果是使用基于rule的最優(yōu)化,優(yōu)化器在確定執(zhí)行路徑時(shí)不會(huì)考慮索引的選擇性(除非是唯一性索引),并且不得不手工優(yōu)化查詢以避免使用非選擇性的索引。
確定索引的選擇性,可以有兩種方法:手工測(cè)量和自動(dòng)測(cè)量。
?。?)手工測(cè)量索引的選擇性
如果要根據(jù)一個(gè)表的兩列創(chuàng)建兩列并置索引,可以用以下方法測(cè)量索引的選擇性:
列的選擇性=不同值的數(shù)目/行的總數(shù) /* 越接近1越好 */
如果我們知道其中一列索引的選擇性(例如其中一列是主鍵),那么我們就可以知道另一列索引的選擇性。
手工方法的優(yōu)點(diǎn)是在創(chuàng)建索引前就能評(píng)估索引的選擇性。
?。?)自動(dòng)測(cè)量索引的選擇性
如果分析一個(gè)表,也會(huì)自動(dòng)分析所有表的索引。
第一,為了確定一個(gè)表的確定性,就要分析表。
第二,確定索引里不同關(guān)鍵字的數(shù)目:
第三,確定表中行的總數(shù):
第四,索引的選擇性=索引里不同關(guān)鍵字的數(shù)目/表中行的總數(shù):
第五,可以查詢USER_TAB_COLUMNS以了解每個(gè)列的選擇性。
表中所有行在該列的不同值的數(shù)目:
列的選擇性=NUM_DISTINCT/表中所有行的總數(shù),查詢USER_TAB_COLUMNS有助測(cè)量每個(gè)列的選擇性,但它并不能精確地測(cè)量列的并置組合的選擇性。要想測(cè)量一組列的選擇性,需要采用手工方法或者根據(jù)這組列創(chuàng)建一個(gè)索引并重新分析表。
四. 確定索引的實(shí)際碎片
隨著數(shù)據(jù)庫(kù)的使用,不可避免地對(duì)基本表進(jìn)行插入,更新和刪除,這樣導(dǎo)致葉子行在索引中被刪除,使該索引產(chǎn)生碎片。插入刪除越頻繁的表,索引碎片的程度也越高。碎片的產(chǎn)生使訪問(wèn)和使用該索引的I/O成本增加。碎片較高的索引必須重建以保持最佳性能。
(1)利用驗(yàn)證索引命令對(duì)索引進(jìn)行驗(yàn)證。
這將有價(jià)值的索引信息填入index_stats表。
?。?)查詢index_stats表以確定索引中刪除的、未填滿的葉子行的百分比。
?。?)如果索引的葉子行的碎片超過(guò)10%,考慮對(duì)索引進(jìn)行重建。
?。?)如果出于空間或其他考慮,不能重建索引,可以整理索引。
?。?)清除分析信息
[NextPage]
五. 重建索引
上一頁(yè)
標(biāo)簽:池州 股票投資 南平 襄陽(yáng) 南平 聊城 通化 嘉峪關(guān)
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Oracle數(shù)據(jù)庫(kù)索引的維護(hù)》,本文關(guān)鍵詞 Oracle,數(shù)據(jù)庫(kù),索引,的,維護(hù),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。