為什麼索引的PCTUSED被設定為0

2008081036發表於2017-11-15

PCTUSED被設定為0

這是一個困擾我很長時間的問題了。

Oracle的文件中就沒有設定PCTUSED這個引數,或者,Oracle已經將這個引數預設為0,但是為什麼Oracle要這樣做?

[@more@]

PCTUSED被設定為0

這是一個困擾我很長時間的問題了。

Oracle的文件中就沒有設定PCTUSED這個引數,或者,Oracle已經將這個引數預設為0,但是為什麼Oracle要這樣做?這個問題是一個國外的一個DBA試題,這個問題應該從以下來說起,

先說一個B*Tree上刪除一行記錄的原理來說:

在索引上刪除一行記錄,其實並不是真的將這行記錄從這個索引塊中刪除,實際上只是將這行記錄的一個標記位設定為刪除標誌,這樣Oracle就認為這一行被刪除,而事實上這一行在物理上是存在這個資料塊中,所以即使是這一行被刪除,這一行所佔用的空間也不會被重新利於。只有一種可能被利於這部分的空間,就是插入一行同樣值的行,或者將這個塊上的所有的行被刪除。

為什麼Oracle要這樣設定哪?主要的原因是因為,索引存放資料是按照一定的順序存放的,即使是這一行被刪除的話,其他數值的行是不能插入到這個位置的,所以,就是即使將這部分空間釋放也是沒有太大的意義的。

這一行不被刪除,而是做一個標識,對以後的同樣的資料的插入會不會有效能上的影響?或者做一個標識,和將這部分清除,會不會影響效能?

我個人的意見是應該不會的,因為,Oracle對資料庫的操作最小的單位是資料塊,不管是刪除還是做標識位,還是插入一個新的資料行,應該說不會影響資料塊的效能,所以之所以索引的PCTUSED被設定為0的主要原因是因為是空間由於索引存放的特點而不能被重複利用。

表需要 pct_used 引數,索引不需要 pct_used 引數。

因為表的索引的原理是不一樣的。表本質上是一種堆結構。想想表設定 pct_used 引數的目的是什麼?是為了當塊的空閒空間小於pct_used 時,該快重新回到 freelist,這樣,該塊就可以重新容納新的一行資料。而索引呢?索引插入哪個塊,哪個位置,是根據什麼確定的?是根據索引列的值本身。與索引段中某一個塊的空閒空間大小無關。如果索引列的值決定了索引必須插入了一個本來沒有空間的塊,oracle甚至不惜以分裂索引的代價來實現。相反,即使某些塊有很多剩餘空間,但是如果索引列的值不合適,剩餘空間再大,新索引項也不會考慮往這些塊儲存。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25465866/viewspace-2147321/,如需轉載,請註明出處,否則將追究法律責任。

相關文章