在Oracle數(shù)據(jù)的存儲(chǔ)中,可以把存儲(chǔ)空間想象為一個(gè)水庫(kù),數(shù)據(jù)想象為水庫(kù)中的水。水庫(kù)中的水的位置有一條線叫做水位線,在Oracle中,這條線被稱(chēng)為高水位線(High-warter mark, HWM)。在數(shù)據(jù)庫(kù)表剛建立的時(shí)候,由于沒(méi)有任何數(shù)據(jù),所以這個(gè)時(shí)候水位線是空的,也就是說(shuō)HWM為最低值。當(dāng)插入了數(shù)據(jù)以后,高水位線就會(huì)上漲,但是這里也有一個(gè)特性,就是如果你采用delete語(yǔ)句刪除數(shù)據(jù)的話,數(shù)據(jù)雖然被刪除了,但是高水位線卻沒(méi)有降低,還是你剛才刪除數(shù)據(jù)以前那么高的水位。也就是說(shuō),這條高水位線在日常的增刪操作中只會(huì)上漲,不會(huì)下跌。


      下面我們來(lái)談一下Oracle中Select語(yǔ)句的特性。Select語(yǔ)句會(huì)對(duì)表中的數(shù)據(jù)進(jìn)行一次掃描,但是究竟掃描多少數(shù)據(jù)存儲(chǔ)塊呢,這個(gè)并不是說(shuō)數(shù)據(jù)庫(kù)中有多少數(shù)據(jù),Oracle就掃描這么大的數(shù)據(jù)塊,而是Oracle會(huì)掃描高水位線以下的數(shù)據(jù)塊?,F(xiàn)在來(lái)想象一下,如果剛才是一張剛剛建立的空表,你進(jìn)行了一次Select操作,那么由于高水位線HWM在最低的0位置上,所以沒(méi)有數(shù)據(jù)塊需要被掃描,掃描時(shí)間會(huì)極短。而如果這個(gè)時(shí)候你首先插入了一千萬(wàn)條數(shù)據(jù),然后再用delete語(yǔ)句刪除這一千萬(wàn)條數(shù)據(jù)。由于插入了一千萬(wàn)條數(shù)據(jù),所以這個(gè)時(shí)候的高水位線就在一千萬(wàn)條數(shù)據(jù)這里。后來(lái)刪除這一千萬(wàn)條數(shù)據(jù)的時(shí)候,由于delete語(yǔ)句不影響高水位線,所以高水位線依然在一千萬(wàn)條數(shù)據(jù)這里。這個(gè)時(shí)候再一次用select語(yǔ)句進(jìn)行掃描,雖然這個(gè)時(shí)候表中沒(méi)有數(shù)據(jù),但是由于掃描是按照高水位線來(lái)的,所以需要把一千萬(wàn)條數(shù)據(jù)的存儲(chǔ)空間都要掃描一次,也就是說(shuō)這次掃描所需要的時(shí)間和掃描一千萬(wàn)條數(shù)據(jù)所需要的時(shí)間是一樣多的。所以有時(shí)候有人總是經(jīng)常說(shuō),怎么我的表中沒(méi)有幾條數(shù)據(jù),但是還是這么慢呢,這個(gè)時(shí)候其實(shí)奧秘就是這里的高水位線了。


       那有沒(méi)有辦法讓高水位線下降呢,其實(shí)有一種比較簡(jiǎn)單的方法,那就是采用TRUNCATE語(yǔ)句進(jìn)行刪除數(shù)據(jù)。采用TRUNCATE語(yǔ)句刪除一個(gè)表的數(shù)據(jù)的時(shí)候,類(lèi)似于重新建立了表,不僅把數(shù)據(jù)都刪除了,還把HWM給清空恢復(fù)為0。所以如果需要把表清空,在有可能利用TRUNCATE語(yǔ)句來(lái)刪除數(shù)據(jù)的時(shí)候就利用TRUNCATE語(yǔ)句來(lái)刪除表,特別是那種數(shù)據(jù)量有可能很大的臨時(shí)存儲(chǔ)表。


        在手動(dòng)段空間管理(Manual Segment Space Management)中,段中只有一個(gè)HWM,但是在Oracle9iRelease1才添加的自動(dòng)段空間管理(Automatic Segment Space Management)中,又有了一個(gè)低HWM的概念出來(lái)。為什么有了HWM還又有一個(gè)低HWM呢,這個(gè)是因?yàn)樽詣?dòng)段空間管理的特性造成的。在手段段空間管理中,當(dāng)數(shù)據(jù)插入以后,如果是插入到新的數(shù)據(jù)塊中,數(shù)據(jù)塊就會(huì)被自動(dòng)格式化等待數(shù)據(jù)訪問(wèn)。而在自動(dòng)段空間管理中,數(shù)據(jù)插入到新的數(shù)據(jù)塊以后,數(shù)據(jù)塊并沒(méi)有被格式化,而是在第一次在第一次訪問(wèn)這個(gè)數(shù)據(jù)塊的時(shí)候才格式化這個(gè)塊。所以我們又需要一條水位線,用來(lái)標(biāo)示已經(jīng)被格式化的塊。這條水位線就叫做低HWM。一般來(lái)說(shuō),低HWM肯定是低于等于HWM的。



what the hell is going on ??!!